Django values_list बनाम मान


146

Django में, निम्नलिखित दो के बीच क्या अंतर है:

Article.objects.values_list('comment_id', flat=True).distinct()

बनाम

Article.objects.values('comment_id').distinct()

मेरा लक्ष्य प्रत्येक के तहत अद्वितीय टिप्पणी आईडी की एक सूची प्राप्त करना है Article। मैंने प्रलेखन पढ़ा है (और वास्तव में दोनों दृष्टिकोणों का उपयोग किया है)। परिणाम बहुत अधिक समान लगते हैं।


मान_सूची के साथ आप उन if self.id in Article.objects.values_list('comment_id', flat=True):मूल्यों का उपयोग करते हुए कर सकते हैं जिन्हें आपको शब्दकोश में उपयोग करने की आवश्यकता है
dnaranjo

1
@dnaranjo - आप कर सकते थे लेकिन सिर्फ क्यों नहीं Article.objects.filter(comment_id=self.id).exists()?
Sayse

1
यह एक अलग सवाल के लिए एक जवाब है
dnaranjo

जवाबों:


250

values()विधि एक क्वेरीसमूह शब्दकोशों युक्त रिटर्न:

<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>

values_list()विधि एक क्वेरीसमूह tuples युक्त रिटर्न:

<QuerySet [(1,), (2,)]>

यदि आप values_list()एकल फ़ील्ड के साथ उपयोग कर रहे हैं , तो आप flat=True1-ट्यूपल के बजाय एकल मानों की क्वेरी वापस करने के लिए उपयोग कर सकते हैं :

<QuerySet [1, 2]>

ओह, और दो अंतर-ए-विज़ के बीच कोई अंतर नहीं distinct()है हुह का उपयोग कैसे किया जाता है?
हसन बेग

2
नहीं, मुझे नहीं लगता कि distinct()कोई अलग तरीके से काम करता है। महत्वपूर्ण बात यह है कि आप किस डेटा संरचना के साथ काम करना चाहते हैं।
अलासैदर

3
values()रिटर्न एक QuerySetऔर नहीं एक list। हालाँकि, ऑब्जेक्ट जिस values()तरह से लौटा है listवह एक जैसा है , यह कुछ मामलों में एक जैसा व्यवहार नहीं करता है। उदाहरण के लिए, जब तक हम इसे `सूची 'में परिवर्तित नहीं करते हैं, तब तक यह क्रमबद्ध नहीं होगा।
अभिजीत घाटे

@AbhijitGhate अच्छी बात है, मैंने यह स्पष्ट करने के लिए उत्तर को अपडेट कर दिया है।
अलसादेयर

2
आप values_listकेवल listफ़ंक्शन का उपयोग करके एक सच्चे पायथन सूची से रिटर्न को आसानी से बदल सकते हैं :list(Article.objects.values_list('comment_id', flat=True).distinct())
इनोस्टिया

55

मूल्यों ()

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

values_list ()

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

विशिष्ट ()

अलग eliminate the duplicateतत्वों के लिए उपयोग किया जाता है।

उदाहरण:

Article.objects.values_list('id', flat=True) # flat=True will remove the tuples and return the list   
[1, 2, 3, 4, 5, 6]

Article.objects.values('id')
[{'id':1}, {'id':2}, {'id':3}, {'id':4}, {'id':5}, {'id':6}]

2
तो यह उन शब्दकोशों की सूची है जो values
हसन बेग

बस स्पष्ट करने के लिए: distinct()क्वेरी परिणामों से डुप्लिकेट तत्वों को समाप्त करता है, डेटाबेस से नहीं।
oz19

5

आप विभिन्न मूल्यों के साथ प्राप्त कर सकते हैं:

set(Article.objects.values_list('comment_id', flat=True))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.