का उपयोग कर के बीच अंतर क्या है:अंतर() और केवल()
Blabla.objects.values('field1', 'field2', 'field3')
और
Blabla.objects.only('field1', 'field2', 'field3')
का उपयोग कर के बीच अंतर क्या है:अंतर() और केवल()
Blabla.objects.values('field1', 'field2', 'field3')
और
Blabla.objects.only('field1', 'field2', 'field3')
मान लिया जाये कि Blabla
अपने प्रश्न में क्षेत्रों, साथ ही field4
है,
Blabla.objects.only('field1', 'field2', 'field3')[0].field4
(कि जानकारी प्राप्त करने में एक नया डेटाबेस क्वेरी के साथ) उस वस्तु के field4
का मूल्य वापस आ जाएगी, जबकि
Blabla.objects.values('field1', 'field2', 'field3')[0].field4
दे देंगे
AttributeError: 'dict' object has no attribute 'field4'
ऐसा इसलिए है क्योंकि .values()
मौजूदा QuerySet
पर आधारित ValuesQuerySet
देता है, जो अनिवार्य रूप से डिक्ट्स की एक सूची है (इस अर्थ में कि एक सामान्य QuerySet
Blabla
ऑब्जेक्ट्स की एक सूची है)।
.values()
देता है तो आप "एक मॉडल की तुलना में कम"; जो आइटम लौटाते हैं वे पूर्ण मॉडल की तुलना में शब्दकोश के करीब होते हैं, जिसका अर्थ है कि आपको मॉडल विशेषताओं को नहीं मिला है, लेकिन आपको पूर्ण मॉडल को प्रारंभ करने की भी आवश्यकता नहीं है।
.only()
एसक्यूएल में फ़ील्ड सूची को उन विशिष्ट फ़ील्ड में प्रतिबंधित करता है जिनकी आप परवाह करते हैं, लेकिन फिर भी एक पूर्ण मॉडल शुरू करते हैं; यह तब तक अन्य फ़ील्ड लोड करने से रोकता है जब तक कि आप उन्हें एक्सेस न करें (यदि बिलकुल नहीं)।
values()
एक विशेष ValueQuerySet
देता है - जो पुनरावर्तित रिटर्न शब्दकोश मॉडल का प्रतिनिधित्व करता है। यह मॉडल वस्तुओं को वापस नहीं करता है।
only()
कि केवल उन स्तंभों तुरंत लौटा दिए जाते हैं सीमित कॉलम लौट आए, और यह सुनिश्चित करने का एक तरीका है - यही कारण है कि कभी कभी के रूप defer()
के विपरीत यह SELECT foo, bar, zoo FROM
कह के बजाय के बराबर है में जाना जाता है सामान्य SELECT [all columns] FROM
। यह QuerySet
लौटाएगा जिसे आगे बढ़ाया जा सकता है।
आइटम जो लौटाते हैं वे * * डिक्ट्स के नजदीक नहीं हैं, वे [* हैं * डिकट्स] (https://github.com/django/django/blob/stable/1.4.x/django/db/models/ query.py # L946) – supervacuo