2011-10-18 3 views
56

मैं कैसे dicts की एक सूची में एक Django क्वेरीसमूह परिवर्तित कर सकते हैं? मुझे इसका कोई जवाब नहीं मिला है इसलिए मैं सोच रहा हूं कि क्या मुझे कुछ प्रकार के सामान्य सहायक कार्य याद आ रहे हैं जो हर कोई उपयोग करता है।मैं Django QuerySet को डिक्ट्स की सूची में कैसे परिवर्तित करूं?

>>> Blog.objects.values() 
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}], 
>>> Blog.objects.values('id', 'name') 
[{'id': 1, 'name': 'Beatles Blog'}] 

नोट::

उत्तर

74

.values() विधि का उपयोग करें परिणाम एक QuerySet जो ज्यादातर एक सूची की तरह व्यवहार करती है, लेकिन वास्तव list का एक उदाहरण नहीं है। list(Blog.objects.values(…)) का उपयोग करें यदि आपको वास्तव में list का उदाहरण चाहिए।

+4

हाँ आप आप कौन सी फ़ील्ड निर्दिष्ट नहीं है 'मूल्यों()' उन्हें तर्कों के रूप में पास करके वापस जाने के लिए। इसके अलावा सावधान रहना होगा, हालांकि यह लग रहा है मानों अपने वास्तव में एक '<वर्ग 'django.db.models.query.ValuesQuerySet'>' और नहीं एक सूची dicts की सूची लौटाता है की तरह। – dm03514

+1

यह वास्तव में एक सूची वापस नहीं करता है हालांकि – astreltsov

+0

धन्यवाद! अपडेट किया गया। –

2

आप वास्तव में क्या शब्दकोशों की तरह दिखना चाहिए परिभाषित नहीं है, लेकिन सबसे अधिक संभावना आप QuerySet.values() की बात कर रहे। official django documentation से: - एक QuerySet उपवर्ग कि शब्दकोशों लौटाता है जब बल्कि मॉडल-उदाहरण वस्तुओं की तुलना, एक iterable के रूप में इस्तेमाल

एक ValuesQuerySet देता है।

उन शब्दकोशों में से प्रत्येक एक वस्तु, कुंजी मॉडल वस्तुओं की विशेषता नाम करने के लिए इसी के साथ प्रतिनिधित्व करता है।

14

.values() विधि आपको ValuesQuerySet प्रकार का परिणाम लौटाएगी जो आमतौर पर आपको अधिकांश मामलों में आवश्यकता होती है।

लेकिन यदि आप चाहें, तो आप पाइथन सूची समझ का उपयोग करके ValuesQuerySet को मूल पायथन सूची में बदल सकते हैं जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है।

result = Blog.objects.values()    # return ValuesQuerySet object 
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list 
return list_result 

मुझे लगता है इसके बाद के संस्करण में मदद करता है अगर तुम इकाई परीक्षण लेखन और है कि एक समारोह की उम्मीद की वापसी मान वास्तविक वापसी मान से मेल खाता का दावा करने की जरूरत है, इस स्थिति में दोनों expected_result और actual_result (एक ही प्रकार का होना चाहिए उदाहरण के लिए शब्दकोश)।

actual_result = some_function() 
expected_result = { 
    # dictionary content here ... 
} 
assert expected_result == actual_result 
+5

या आप इस सूची (परिणाम) के साथ सूची में कनवर्ट करना सरल बना सकते हैं। –

0

आप dict आप Django मॉडल क्षेत्र आप पर प्रश्नों बनाने से मिल गया पर values() विधि का उपयोग कर सकते हैं और फिर आप आसानी से एक सूचकांक मूल्य द्वारा प्रत्येक क्षेत्र पहुँच सकते हैं।

इसे इस तरह कॉल -

myList = dictOfSomeData.values() 
itemNumberThree = myList[2] #If there's a value in that index off course... 
2

आप (जैसे JSON क्रमबद्धता) किसी कारण के लिए देशी डेटा प्रकार की जरूरत है यह मेरा त्वरित 'एन' गंदा यह करने के लिए तरीका है:

data = [{'id': blog.pk, 'name': blog.name} for blog in blogs] 

आप सूची के अंदर dict निर्माण देख सकते हैं वास्तव में सूखी इसलिए यदि किसी को एक बेहतर तरीका जानता है ...

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