Nei progetti Django in cui so che pkritorna sempre idpreferisco usare idquando 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 idquando ci vuole tempo per cercare il pknome 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_idinvece 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 idqui.
Per riassumere, spetta a te scegliere se utilizzare il nome del campo ido il pkcollegamento. Se non stai sviluppando una libreria per Django e utilizzi i campi chiave primaria automatici per tutti i modelli, è sicuro da usare idovunque, che a volte è più veloce. D'altra parte, se si desidera l'accesso universale a campi chiave primari (probabilmente personalizzati), utilizzare pkovunque. Un terzo di un microsecondo non è nulla per il web.
ide perpk