मैं एक Django क्वेरी को डिकेट्स की सूची में कैसे बदल सकता हूं? मुझे इसका जवाब नहीं मिला है इसलिए मैं सोच रहा हूं कि क्या मैं किसी प्रकार के सामान्य सहायक फ़ंक्शन को याद कर रहा हूं जिसका उपयोग हर कोई करता है।
मैं एक Django क्वेरी को डिकेट्स की सूची में कैसे बदल सकता हूं? मुझे इसका जवाब नहीं मिला है इसलिए मैं सोच रहा हूं कि क्या मैं किसी प्रकार के सामान्य सहायक फ़ंक्शन को याद कर रहा हूं जिसका उपयोग हर कोई करता है।
जवाबों:
.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
।
values()
, मुझे नहीं पता कि क्या कोई अच्छा तरीका है, values()
लेकिन उदाहरण के तरीकों को कॉल करने के साथ?
.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
list(result)
यदि आपको किसी कारण के लिए मूल डेटा प्रकारों की आवश्यकता है (जैसे JSON क्रमांकन) यह मेरा त्वरित 'n' गंदा तरीका है:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
जैसा कि आप देख सकते हैं कि सूची के अंदर तानाशाही का निर्माण वास्तव में DRY नहीं है, अगर कोई बेहतर तरीका जानता है ...
data = list( blogs )
और फिर json.dumps( data )
। एक वस्तु जावास्क्रिप्ट पक्ष पर वस्तुओं के एक समूह के साथ निकलती है, किसी भी पार्सिंग की आवश्यकता नहीं होती है।
आप बिल्कुल परिभाषित नहीं करते हैं कि शब्दकोशों को कैसा दिखना चाहिए, लेकिन सबसे अधिक संभावना है कि आप इसका उल्लेख कर रहे हैं QuerySet.values()
। से आधिकारिक Django प्रलेखन :
लौटाता है
ValuesQuerySet
- एकQuerySet
उपवर्ग जो शब्दकोशों को वापस लौटाता है जब इसे मॉडल-उदाहरण ऑब्जेक्ट्स के बजाय एक पुनरावृत्त के रूप में उपयोग किया जाता है।उन शब्दकोशों में से प्रत्येक एक ऑब्जेक्ट का प्रतिनिधित्व करता है, जिसमें मॉडल ऑब्जेक्ट्स के विशेषता नामों के अनुरूप कुंजियां होती हैं।
टाइप कास्ट टू लिस्ट
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
आप values()
जिस Django मॉडल फ़ील्ड से क्वेरीज़ बनाते हैं, उस पर आप इस विधि का उपयोग कर सकते हैं और फिर आप आसानी से इंडेक्स वैल्यू द्वारा प्रत्येक फ़ील्ड तक पहुँच प्राप्त कर सकते हैं।
इसे इस तरह से कॉल करें -
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
आपको जरूरत है DjangoJSONEncoder
और list
अपने रेफरी को बनाने के Queryset
लिए json
: पायथन जोंसन एक दशमलव वस्तु को क्रमबद्ध करता है
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
सीधे शब्दों में कहें list(yourQuerySet)
।
values()
उन्हें किस तर्क के रूप में पारित करके वापस करना चाहते हैं । इसके अलावा सावधान रहें हालांकि ऐसा लगता है कि मान वास्तव में एक<class 'django.db.models.query.ValuesQuerySet'>
और नहीं एक सूची dicts की सूची देता है।