En los proyectos de Django donde sé que pk
siempre regresa id
, prefiero usarlos id
cuando no entran en conflicto con la id()
función (en todas partes, excepto los nombres de variables). La razón de esto es que pk
es una propiedad que es 7 veces más lenta que id
desde que lleva tiempo buscar el pk
nombre del atributo 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 en user_id
lugar depk
.
Seguir la misma convención es preferible en todo el proyecto. En su caso, id
es un nombre de parámetro, no una propiedad, por lo que casi no hay diferencia en los tiempos. Los nombres de los parámetros no coinciden con el nombre de la id()
función incorporada, por lo que es seguro usarid
aquí.
En resumen, depende de usted elegir si desea usar el nombre del campo id
o el pk
acceso directo. Si no está desarrollando una biblioteca para Django y utiliza campos de clave primaria automáticos para todos los modelos, es seguro usarlos en id
todas partes, lo que a veces es más rápido. Por otro lado, si desea acceso universal a los campos de clave primaria (probablemente personalizados), utilícelos en pk
todas partes. Un tercio de microsegundo no es nada para la web.
id
y parapk