In Django-Projekten, von denen ich weiß, dass sie pkimmer zurückkehren, idbevorzuge ich die Verwendung, idwenn sie nicht mit der id()Funktion kollidieren (überall außer Variablennamen). Der Grund dafür ist, dass pkes sich um eine Eigenschaft handelt, die siebenmal langsamer ist als iddie Suche nach pkAttributnamen in 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)
Hier ist der relevante Django-Code:
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 ist wirklich ein seltener Fall, wenn ich eine Variable mit dem Namen verwenden muss pk. Ich bevorzuge es, etwas ausführlicheres zu verwenden, user_idanstatt pk.
Die Befolgung derselben Konvention ist für das gesamte Projekt vorzuziehen. In Ihrem Fall idhandelt es sich um einen Parameternamen, nicht um eine Eigenschaft, sodass sich die Timings kaum unterscheiden. Parameternamen kollidieren nicht mit dem Namen der integrierten id()Funktion, daher ist die Verwendung sicherid hier .
Zusammenfassend liegt es an Ihnen, zu entscheiden, ob Sie den Feldnamen idoder die pkVerknüpfung verwenden möchten. Wenn Sie keine Bibliothek für Django entwickeln und für alle Modelle automatische Primärschlüsselfelder verwenden, können Sie diese idüberall verwenden, was manchmal schneller ist. Wenn Sie andererseits universellen Zugriff auf (wahrscheinlich benutzerdefinierte) Primärschlüsselfelder wünschen, verwenden Sie diese pküberall. Eine Drittel-Mikrosekunde ist nichts für das Web.
idund fürpk