Domande Django - id vs pk


203

Quando si scrivono query django si possono usare sia id / pk come parametri di query.

Object.objects.get(id=1)
Object.objects.get(pk=1)

So che pk sta per chiave primaria ed è solo una scorciatoia, secondo la documentazione di Django. Tuttavia non è chiaro quando si dovrebbe usare id o pk.


Ecco la rispettiva documentazione: a favoreid e perpk
Lutz Prechelt del



Controlla qui la versione aggiornata docs.djangoproject.com/en/2.2/topics/db/models/…
Tessaracter

Risposte:


224

Non importa pkè più indipendente dal campo di chiave primaria effettiva cioè che non è necessario per la cura se il campo chiave primaria si chiama ido di object_ido qualsiasi altra cosa.

Fornisce inoltre maggiore coerenza se si hanno modelli con campi chiave primaria diversi.


34
Sì. Usa solo pk. Sempre.
cethegeek,

47
idè anche una funzione integrata in Python, per questo preferisco usare pk.
Thierry Lam,

5
Sì, pkè preferibile. Vedi la documentazione della funzione integrataid nella libreria standard di Python. (È lo stesso in Python 2. )
Lutz Prechelt il

26

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.