Django क्वेरीज़ - आईडी बनाम पीके


202

Django क्वेरी लिखते समय कोई भी id / pk दोनों को क्वेरी पैरामीटर के रूप में उपयोग कर सकता है।

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

मुझे पता है कि पीजी प्राथमिक कुंजी के लिए खड़ा है और django के प्रलेखन के अनुसार सिर्फ एक शॉर्टकट है। हालांकि यह स्पष्ट नहीं है कि किसी को आईडी या पीके का उपयोग कब करना चाहिए।


यहाँ यह है कि संबंधित docmentation: के लिएid और के लिएpk
Lutz Prechelt


जानना चाहते हैं कि क्या कुछ अधिक है docs.djangoproject.com/en/1.11/topics/db/queries/…
राजन चौहान

यहाँ अद्यतित संस्करण की जाँच करें docs.djangoproject.com/en/2.2/topics/db/models/…
Tessaracter

जवाबों:


224

इससे कोई फर्क नहीं पड़ता। pkयानी आप देखभाल करने के लिए है कि क्या प्राथमिक कुंजी क्षेत्र कहा जाता है की जरूरत नहीं है वास्तविक प्राथमिक कुंजी क्षेत्र से अधिक स्वतंत्र है idया object_idया जो कुछ भी।

यदि आपके पास विभिन्न प्राथमिक कुंजी फ़ील्ड वाले मॉडल हैं, तो यह अधिक स्थिरता भी प्रदान करता है।


34
हां। बस पीके का उपयोग करें। हमेशा।
cethegeek

47
idपायथन में भी एक अंतर्निहित कार्य है, मैं उस वजह से पीके का उपयोग करना पसंद करता हूं।
थियरी लैम

5
हाँ, pkबेहतर है। पायथन मानक पुस्तकालय में अंतर्निहित फ़ंक्शनid के दस्तावेज़ देखें । (यह पायथन 2 में भी ऐसा ही है ।)
लुट्ज़ प्रेचल

25

Django परियोजनाओं में, जहां मुझे पता है कि pkहमेशा वह रिटर्न देता है जिसे idमैं उपयोग करना पसंद idकरता हूं जब यह id()फ़ंक्शन (हर जगह चर नामों को छोड़कर) से टकराता नहीं है। इसका कारण यह है कि pkएक संपत्ति है जो 7 गुना धीमी है idक्योंकि इसमें pkविशेषता नाम देखने में समय लगता है 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)

यहाँ प्रासंगिक Django कोड है:

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)

यह वास्तव में एक दुर्लभ मामला है जब मुझे नाम के एक चर का उपयोग करने की आवश्यकता होती है pk। मैं कुछ और क्रियाओं का उपयोग करना पसंद करता हूं, जैसे कि user_idइसके बजाय pk

एक ही सम्मेलन के बाद पूरी परियोजना के लिए बेहतर है। आपके मामले idमें एक पैरामीटर नाम है, संपत्ति नहीं है, इसलिए समय में लगभग कोई अंतर नहीं है। पैरामीटर नाम अंतर्निहित id()फ़ंक्शन के नाम से नहीं टकराते हैं , इसलिए idयहां उपयोग करना सुरक्षित है।

योग करने के लिए, यह आप पर निर्भर है कि फील्ड नाम idया pkशॉर्टकट का उपयोग करना है या नहीं । यदि आप Django के लिए लाइब्रेरी विकसित नहीं कर रहे हैं और सभी मॉडलों के लिए स्वचालित प्राथमिक कुंजी फ़ील्ड का उपयोग करते हैं, तो यह idहर जगह उपयोग करना सुरक्षित है, जो कभी-कभी तेज होता है। दूसरी ओर, यदि आप प्राथमिक कुंजी क्षेत्रों (शायद कस्टम) के लिए सार्वभौमिक पहुंच चाहते हैं, तो pkहर जगह उपयोग करें । माइक्रोसेकंड का एक तिहाई वेब के लिए कुछ भी नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.