Consultas de Django: id vs pk

Resuelto Art asked hace 14 años • 2 respuestas

Al escribir consultas de Django, se pueden usar id/pk como parámetros de consulta.

Object.objects.get(id=1)
Object.objects.get(pk=1)

Sé que pk significa clave primaria y es solo un atajo, según la documentación de Django. Sin embargo, no está claro cuándo se debe utilizar id o pk.

Art avatar Jan 30 '10 06:01 Art
Aceptado

No importa. pkes más independiente del campo de clave principal real, es decir, no necesita preocuparse si se llama al campo de clave principal ido object_idlo que sea.

También proporciona más coherencia si tiene modelos con diferentes campos de clave principal.

Felix Kling avatar Jan 29 '2010 23:01 Felix Kling

En proyectos de Django donde sé que pksiempre regresa, idprefiero usarlo idcuando no entre en conflicto con la id()función (en todas partes excepto en los nombres de las variables). La razón de esto es que pkes una propiedad que es 7 veces más lenta, idya que lleva tiempo buscar pkel nombre del atributo en meta.

%timeit obj.id
46 ns ± 0.187 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit obj.pk
347 ns ± 11.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Aquí está el código Django relevante:

def _get_pk_val(self, meta=None):
    meta = meta or self._meta
    return getattr(self, meta.pk.attname)

def _set_pk_val(self, value):
    return setattr(self, self._meta.pk.attname, value)

pk = property(_get_pk_val, _set_pk_val)

Es realmente un caso raro cuando necesito usar una variable llamada pk. Prefiero usar algo más detallado, como user_iden lugar de pk.

Es preferible seguir la misma convención en todo el proyecto. En su caso id, es el nombre de un parámetro, no una propiedad, por lo que casi no hay diferencia en los tiempos. Los nombres de los parámetros no entran en conflicto con el nombre de la función incorporada id(), por lo que es seguro utilizarlos idaquí.

En resumen, depende de usted elegir si desea utilizar el nombre del campo ido el pkacceso directo. Si no está desarrollando una biblioteca para Django y usa campos de clave primaria automáticos para todos los modelos, es seguro usarlo iden todas partes, lo que a veces es más rápido. Por otro lado, si desea acceso universal a los campos de clave principal (probablemente personalizados), utilícelo pken todas partes. Un tercio de microsegundo no es nada para la web.

utapyngo avatar Nov 01 '2018 12:11 utapyngo