2012-08-15 13 views

उत्तर

4

मान लिया जाये कि 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 देता है, जो अनिवार्य रूप से डिक्ट्स की एक सूची है (इस अर्थ में कि एक सामान्य QuerySetBlabla ऑब्जेक्ट्स की एक सूची है)।

3

.values() देता है तो आप "एक मॉडल की तुलना में कम"; जो आइटम लौटाते हैं वे पूर्ण मॉडल की तुलना में शब्दकोश के करीब होते हैं, जिसका अर्थ है कि आपको मॉडल विशेषताओं को नहीं मिला है, लेकिन आपको पूर्ण मॉडल को प्रारंभ करने की भी आवश्यकता नहीं है।

.only() एसक्यूएल में फ़ील्ड सूची को उन विशिष्ट फ़ील्ड में प्रतिबंधित करता है जिनकी आप परवाह करते हैं, लेकिन फिर भी एक पूर्ण मॉडल शुरू करते हैं; यह तब तक अन्य फ़ील्ड लोड करने से रोकता है जब तक कि आप उन्हें एक्सेस न करें (यदि बिलकुल नहीं)।

+4

आइटम जो लौटाते हैं वे * * डिक्ट्स के नजदीक नहीं हैं, वे [* हैं * डिकट्स] (https://github.com/django/django/blob/stable/1.4.x/django/db/models/ query.py # L946) – supervacuo

1

values() एक विशेष ValueQuerySet देता है - जो पुनरावर्तित रिटर्न शब्दकोश मॉडल का प्रतिनिधित्व करता है। यह मॉडल वस्तुओं को वापस नहीं करता है।

only() कि केवल उन स्तंभों तुरंत लौटा दिए जाते हैं सीमित कॉलम लौट आए, और यह सुनिश्चित करने का एक तरीका है - यही कारण है कि कभी कभी के रूप defer() के विपरीत यह SELECT foo, bar, zoo FROM कह के बजाय के बराबर है में जाना जाता है सामान्य SELECT [all columns] FROM। यह QuerySet लौटाएगा जिसे आगे बढ़ाया जा सकता है।

संबंधित मुद्दे