Consultas de Django: id vs pk
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.
No importa. pk
es más independiente del campo de clave principal real, es decir, no necesita preocuparse si se llama al campo de clave principal id
o object_id
lo que sea.
También proporciona más coherencia si tiene modelos con diferentes campos de clave principal.
En proyectos de Django donde sé que pk
siempre regresa, id
prefiero usarlo id
cuando 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 pk
es una propiedad que es 7 veces más lenta, id
ya que lleva tiempo buscar pk
el 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_id
en 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 id
aquí.
En resumen, depende de usted elegir si desea utilizar el nombre del campo id
o el pk
acceso directo. Si no está desarrollando una biblioteca para Django y usa campos de clave primaria automáticos para todos los modelos, es seguro usarlo id
en 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 pk
en todas partes. Un tercio de microsegundo no es nada para la web.