मैं एक Django क्वेरी को डिकेट्स की सूची में कैसे बदलूं?


122

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

जवाबों:


176

.values()विधि का प्रयोग करें :

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

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


7
हाँ, आप निर्दिष्ट करते हैं कि आप values()उन्हें किस तर्क के रूप में पारित करके वापस करना चाहते हैं । इसके अलावा सावधान रहें हालांकि ऐसा लगता है कि मान वास्तव में एक <class 'django.db.models.query.ValuesQuerySet'>और नहीं एक सूची dicts की सूची देता है।
dm03514

10
यह वास्तव में हालांकि एक सूची नहीं
लौटाता है

इसके अलावा, आप अपनी वस्तु के उदाहरण के तरीकों से परिणाम प्राप्त नहीं कर सकते values(), मुझे नहीं पता कि क्या कोई अच्छा तरीका है, values()लेकिन उदाहरण के तरीकों को कॉल करने के साथ?
आसरा

34

.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

17
या आप इस के साथ सूची में परिवर्तित करने को सरल बना सकते हैंlist(result)
अदियात मुबारक

12

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

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

जैसा कि आप देख सकते हैं कि सूची के अंदर तानाशाही का निर्माण वास्तव में DRY नहीं है, अगर कोई बेहतर तरीका जानता है ...


मुझे लगता है कि यह साथ काम कर रहा है data = list( blogs )और फिर json.dumps( data )। एक वस्तु जावास्क्रिप्ट पक्ष पर वस्तुओं के एक समूह के साथ निकलती है, किसी भी पार्सिंग की आवश्यकता नहीं होती है।
आर्थर तरासोव

3

आप बिल्कुल परिभाषित नहीं करते हैं कि शब्दकोशों को कैसा दिखना चाहिए, लेकिन सबसे अधिक संभावना है कि आप इसका उल्लेख कर रहे हैं QuerySet.values()। से आधिकारिक Django प्रलेखन :

लौटाता है ValuesQuerySet- एक QuerySetउपवर्ग जो शब्दकोशों को वापस लौटाता है जब इसे मॉडल-उदाहरण ऑब्जेक्ट्स के बजाय एक पुनरावृत्त के रूप में उपयोग किया जाता है।

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



1

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

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

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



0

आप एक फ़ंक्शन को मॉडल_to_dict का उपयोग करके परिभाषित कर सकते हैं:

def queryset_to_dict(qs,fields=None, exclude=None):
    my_array=[]
    for x in qs:
        my_array.append(model_to_dict(x,fields=fields,exclude=exclude))
    return my_array
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.