2013-08-14 5 views
6

मैं Django में कई क्वेरीज़ को जोड़ना या श्रृंखला बनाना चाहता हूं, प्रत्येक के आदेश को संरक्षित करना (परिणाम नहीं)। मैं परिणाम को पेजेट करने के लिए एक थर्ड-पार्टी लाइब्रेरी का उपयोग कर रहा हूं, और यह केवल सूचियों या क्वेरीसेट स्वीकार करता है। मैंने इन विकल्पों का प्रयास किया है:व्यक्तिगत आदेश को सुरक्षित रखने वाले Django क्वेरीसेट्स को कैसे चेन करें

क्वेरीसेट में शामिल हों: व्यक्तिगत क्वेरीसेट में ऑर्डरिंग को सुरक्षित नहीं करता है, इसलिए मैं इसका उपयोग नहीं कर सकता।

result = queryset_1 | queryset_2 

itertools का उपयोग करना: श्रृंखला वस्तु पर list() कॉलिंग वास्तव में क्वेरीसमूहों मूल्यांकन करता है और इस भूमि के ऊपर का एक बहुत हो सकता है। है ना?

result = list(itertools.chain(queryset_1, queryset_2)) 

आपको कैसे लगता है कि मुझे जाना चाहिए?

उत्तर

4

क्वेरीसमूहों विभिन्न मॉडलों के हैं, तो आप सूची में इनका मूल्यांकन करने के लिए है और फिर आप बस संलग्न कर सकते हैं:

result = list(queryset_1) + list(queryset_2) 

वे एक ही मॉडल हैं, तो आप का उपयोग करके क्वेरी को संयोजित करना चाहिए Q object और ' order_by ("queryset_1 फ़ील्ड", "queryset_2 फ़ील्ड") '।

सही उत्तर इस बात पर निर्भर करता है कि आप इन्हें क्यों जोड़ना चाहते हैं और आप परिणामों का उपयोग कैसे करेंगे।

+0

मैं एक ही मॉडल कई प्रश्नों में splitted पर एक जटिल खोज के कर रहा हूँ। प्रत्येक एक रिकॉर्ड को पुनर्प्राप्त करता है जो एक निश्चित स्थिति से मेल खाता है और प्रत्येक को किसी विशेष तरीके से आदेश दिया जाता है। परिणाम में प्रत्येक क्वेरीसेट के परिणाम शामिल होना चाहिए और इनमें से प्रत्येक क्वेरीसेट का क्रम बनाए रखना चाहिए। इसलिए, मैं यहां 'क्यू' ऑब्जेक्ट्स का उपयोग नहीं कर सकता, क्योंकि मुझे एक ही क्वेरी पर कई 'order_by() 'करने की अनुमति नहीं दी जाएगी। मैं डाटाबेस तक पहुंचने से बचने के लिए, प्रत्येक क्वेरीसेट पर 'सूची() 'को कॉल करने से बचाना चाहता हूं, स्मृति में बहुत सारी ऑब्जेक्ट प्राप्त करना चाहता हूं। – Caumons

+0

क्या आपको लगता है कि एक शुद्ध SQL क्वेरी लिखना संभव है जो पंक्तियों का एक सेट सेट करेगा और ठीक वैसे ही फ़िल्टर किया जाएगा जैसा आप चाहते हैं? यदि नहीं, तो एक एकल क्वेरीसेट इसे भी नहीं कर सकता है।यदि आप दो परिणाम सेट को असंगत तरीकों से सेट करते हैं, उदाहरण के लिए। यदि आप जटिल रूप से दो अलग-अलग आदेशित परिणाम सेटों से जुड़ने के लिए इस असंगतता के आसपास काम करते हैं, तो ऐसा कुछ नहीं है जो django ORM कर सकता है। – Demiurge

+0

मैं शुद्ध एसक्यूएल में प्रवेश नहीं करना चाहता जितना मैं Django के ORM के साथ रह सकता हूं। मैं बस यह देखने के लिए कह रहा था कि स्मृति में हजारों ऑब्जेक्ट्स से बचने के लिए सीमित क्वेरी के साथ मैं क्या कर रहा हूं (वर्तमान में दूसरा उदाहरण उपयोग कर रहा हूं) के लिए बेहतर विकल्प है या नहीं। – Caumons

0

अगर आप की जरूरत एक तिहाई क्वेरीसमूह में दो क्वेरीसमूहों मर्ज करने के लिए, यहाँ एक उदाहरण है, _result_cache का उपयोग कर।

  1. (क्वेरी 1) खाली स्थिति पहले जाओ, देशों
  2. द्वारा आदेश दिया:

    मॉडल

    class ImportMinAttend(models.Model): 
        country=models.CharField(max_length=2, blank=False, null=False) 
        status=models.CharField(max_length=5, blank=True, null=True, default=None) 
    

    इस मॉडल से, मैं सभी पंक्तियों में इस तरह की एक सूची प्रदर्शित करना चाहते हैं

  3. (क्वेरी 2) गैर खाली स्थिति दूसरे स्थान पर जाती है, देश द्वारा
,210

मैं क्वेरी 1 और क्वेरी 2.

#get all the objects 
    queryset=ImportMinAttend.objects.all() 

    #get the first queryset 
    queryset_1=queryset.filter(status=None).order_by("country") 
    #len or anything that hits the database 
    len(queryset_1) 

    #get the second queryset 
    queryset_2=queryset.exclude(status=None).order_by("country") 

    #append the second queryset to the first one AND PRESERVE ORDER 
    for query in queryset_2: 
     queryset_1._result_cache.append(query) 

    #final result 
    queryset=queryset_1 

यह बहुत ही कुशल नहीं हो सकता है मर्ज करना चाहते हैं, लेकिन यह काम करता है :)।

+0

यह दोनों क्वेरीसेट्स पर कॉलिंग सूची() से अधिक कुशल लगता है। यदि आप सबसे छोटे से फिर से शुरू करते हैं तो यह बेहतर लगता है। मुझे जो पसंद नहीं है वह निजी विशेषता _result_cache को संशोधित कर रहा है ... क्या आप वाकई सुरक्षित हैं? – Caumons

+0

यह दृष्टिकोण अभी भी सभी क्वेरीसेट का मूल्यांकन करेगा जो उनकी सूची बनाने जैसा ही है, जो प्रश्न का लेखक नहीं चाहता है। –

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