Nei progetti Django in cui so che pk
ritorna sempre id
preferisco usare id
quando non si scontrano con la id()
funzione (ovunque tranne i nomi delle variabili). La ragione di ciò è che pk
è una proprietà che è 7 volte più lenta di da id
quando ci vuole tempo per cercare il pk
nome dell'attributo 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)
Ecco il codice Django pertinente:
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)
È davvero un caso raro quando devo usare una variabile chiamata pk
. Preferisco usare qualcosa di più dettagliato, come user_id
invece di pk
.
Seguire la stessa convenzione è preferibile in tutto il progetto. Nel tuo caso id
è un nome di parametro, non una proprietà, quindi non c'è quasi alcuna differenza nei tempi. I nomi dei parametri non si scontrano con il nome della id()
funzione integrata, quindi è sicuro utilizzarli id
qui.
Per riassumere, spetta a te scegliere se utilizzare il nome del campo id
o il pk
collegamento. Se non stai sviluppando una libreria per Django e utilizzi i campi chiave primaria automatici per tutti i modelli, è sicuro da usare id
ovunque, che a volte è più veloce. D'altra parte, se si desidera l'accesso universale a campi chiave primari (probabilmente personalizzati), utilizzare pk
ovunque. Un terzo di un microsecondo non è nulla per il web.
id
e perpk