2011-01-27 8 views
27

मैं एक मोड़ Django क्वेरीसमूह को छानने के साथ है (?):Django objects.filter() values_list() बनाम __in क्वेरी के लिए अजगर सूची समझ

ipdb> MagazineIssue.objects.filter(id__in=l_magazines.values_list('id')) 
Out[0]: [] 

या

ipdb> MagazineIssue.objects.filter(id__in=[l_magazine.id for l_magazine in l_magazines]) 
Out[0]: [<MagazineIssue: Architecture Australia, Jan 1995 (#1)>] 

और

ipdb> l_magazines.values_list('id') 
Out[0]: [(1,)] 
ipdb> [l_magazine.id for l_magazine in l_magazines] 
Out[0]: [1] 

तो, value_list() का उपयोग कैसे करें? (उत्पादन के लिए):

[1] 

या पाइथन सूची समझ 'जाने का रास्ता' है?

उत्तर

56

l_magazines.values_list('id', flat=True) आज़माएं। यह एकल आईडी tuples की सूची के बजाय आईडी की एक सूची देता है। नोट करने के लिए

+5

क्या कोई प्रदर्शन अंतर है? – Marcin

+3

विशाल। values_list तेज़ तेज़ है। फ्लैट = सत्य इसे और भी तेज बनाता है क्योंकि पायथन को सूची में सभी ऑब्जेक्ट्स को तुरंत चालू करने की आवश्यकता नहीं होती है, केवल डेटाबेस मान लौटाए जाते हैं। स्पष्टीकरण के लिए –

+1

, यह तेज़ है क्योंकि Django पहचानता है कि हम एक क्वेरीसेट को क्वेरीसेट के लिए तर्क के रूप में उपयोग कर रहे हैं, इसलिए यह उन्हें एक ही क्वेरी में जोड़ता है - यह पहले सूची में 'value_list' क्वेरीसेट का मूल्यांकन नहीं करता है! – Anentropic

2

एक बात वहाँ मूल्यों के व्यवहार में एक फर्क है कि है/एक सूची समझ से values_list:

  • मूल्यों/values_list क्षेत्र में संग्रहीत वास्तविक मूल्य निकलेगा, वह है, बस आईडी (पूरी वस्तु नहीं)
  • यदि मान एक विदेशी कुंजी है, और आपके मॉडल में उचित संबंध स्थापित हैं, तो सूची समझ आपको विदेशी कुंजी द्वारा निर्दिष्ट वस्तु प्रदान करेगी।

गलत चुनने के परिणामस्वरूप आप जो भी करने की कोशिश कर रहे हैं उसके आधार पर अनावश्यक डेटाबेस हिट, या अनावश्यक फफिंग का परिणाम होगा।

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