Django sorguları - id vs pk


205

Django sorguları yazılırken sorgu parametreleri olarak id / pk her ikisi de kullanılabilir.

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

Django'nun belgelerine göre pk, Birincil Anahtar anlamına geldiğini ve sadece bir kısayol olduğunu biliyorum. Ancak ne zaman id veya pk kullanılması gerektiği açık değildir.


İşte bu ilgili idpk
belgesel


Bir şeyin daha fazla olup olmadığını bilmek istiyorum docs.djangoproject.com/tr/1.11/topics/db/queries/…
Rajan Chauhan

Güncelleme sürümünü buradan kontrol edin docs.djangoproject.com/tr/2.2/topics/db/models/…
Tessaracter

Yanıtlar:


224

Önemli değil. pkgerçek birincil anahtar alanından daha bağımsızdır, yani birincil anahtar alanının çağrılıp çağrılmadığına idveya object_idherhangi bir şeye dikkat etmeniz gerekmez .

Ayrıca, farklı birincil anahtar alanlarına sahip modelleriniz varsa daha fazla tutarlılık sağlar.


35
Evet. Sadece pk kullanın. Her zaman.
cethegeek

48
idayrıca Python'da yerleşik bir işlevdir, bu yüzden pk kullanmayı tercih ederim.
Thierry Lam

6
Evet, pktercih edilir. Python standart kütüphanesindeki yerleşik fonksiyonun belgelerineid bakın . ( Python 2'de de aynıdır .)
Lutz Prechelt

26

Her pkzaman döndürdüğünü bildiğim Django projelerinde , işlevle (değişken adları hariç her yerde) çakışmadığında idkullanmayı tercih ederim . Bunun nedeni, öznitelik adını aramak zaman aldığı için 7 kat daha yavaş bir özellik olmasıdır .idid()pkidpkmeta

%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)

İlgili Django kodu şöyledir:

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)

Adında bir değişken kullanmam gerektiğinde çok nadir görülen bir durumdur pk. Bunun user_idyerine daha ayrıntılı bir şey kullanmayı tercih ederim pk.

Tüm projede aynı sözleşmeyi izlemek tercih edilir. Sizin durumunuzda idbir özellik değil, bir parametre adı vardır, bu nedenle zamanlamalarda neredeyse hiçbir fark yoktur. Parametre adları yerleşik id()işlevin adıyla çakışmaz , bu nedenle idburada kullanmak güvenlidir .

Özetlemek gerekirse, alan adı idmı yoksa pkkısayol mu kullanacağınızı seçmek size kalmıştır . Django için bir kitaplık geliştirmiyorsanız ve tüm modeller için otomatik birincil anahtar alanları kullanıyorsanız, idher yerde kullanmak güvenlidir , bu da bazen daha hızlıdır. Diğer taraftan, birincil anahtar alanlarına (muhtemelen özel) evrensel erişim istiyorsanız, pkher yerde kullanın . Mikrosaniyenin üçte biri web için bir şey değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.