2010-06-04 12 views
14

एक ही कक्षा के दो प्रश्नोत्तरी वस्तुओं पर विचार करें। क्या यूनियन की गणना करके उन्हें एक प्रश्नोत्तरी में एकीकृत करने का कोई आसान तरीका है? इसके अलावा, क्या उन्हें घटाने का एक आसान तरीका है? सेट में से किसी एक सेट में दिखाई देने वाले सभी तत्वों को हटा रहा है?QuerySet संघ और django में घटाव के लिए सरल तरीका?

+0

हम कैसे आप प्रारंभिक दो क्वेरीसमूहों उत्पन्न के कुछ उदाहरण हो और कर सकते हैं कि वे किस तरह इस्तेमाल कर रहे हैं? अधिक जानकारी के साथ आप जोड़ने/घटाने के बजाय बस अपने मूल क्वेरीसेट को अनुकूलित करने में सक्षम हो सकते हैं? –

+0

qs1 = MyObj1.objects.filter (some_field__gte = value) - दूसरी तरफ qs2 वास्तव में एक निश्चित MyObj2 इंस्टेंस और MyObj1 उदाहरण के बीच एक एम 2 एम संबंध है, मुझे लगा कि मैं क्वेरीसेट्स के बारे में पूछूंगा, क्योंकि मुझे लगता है कि उत्तर होगा myobj2_instance.myobj1 पर भी लागू होता है। – Jonathan

उत्तर

1

मुझे ऑपरेशन के लिए लगता है क्योंकि आपको उन्हें evalute करने की आवश्यकता है। तो आप उन पर list() पर कॉल कर सकते हैं और सामान्य पायथन सूची संचालन के साथ उन पर काम कर सकते हैं!

3

आप Q object का उपयोग कर सकते हैं।

वाक्य रचना कुछ इस तरह हो सकता है:

added_query_set = YourModel.objects.\ 
     filter(Q(id__in=old_query_set_1)|Q(id__in=old_query_set_2)) 

आप शायद अपने वास्तविक जरूरतों के आधार पर अनुकूलित कर सकते हैं और के डाटाबेस नीचे हिट (अभी यह 3 है) राशि प्राप्त है, लेकिन यह आपके लिए प्रारंभ करने चाहिए।

+0

+1 इसे क्वेरीसेट के साथ अच्छी तरह से करने के लिए +1 है, लेकिन मुझे लगता है कि यह सूची जोड़ने से एक बार डीबी को भी मार रहा है! मुझे लगता है कि आप जिस विधि को पसंद करते हैं उस पर निर्भर करता है कि क्या आप एक अपरिचित क्यू या कम डीबी हिट चाहते हैं! –

+0

दो मूल 'क्वेरीज़सेट' के वास्तविक मानकों को देखते हुए आप उन मानकों को 'क्यू' ऑब्जेक्ट्स में शामिल करने में सक्षम होना चाहिए और एक डीबी हिट – Zach

12

django's documentation करने के लिए वापस जा रहे हैं, तो आप कर सकते हैं:

new_query_set = query_set_1 | query_set_2 

यह एक तार्किक रूप में काम करता है या जो वास्तव में डुप्लिकेट के बिना है। यह अतिरिक्त पहलू का जवाब देता है और AFAIK सभी पर डीबी को हिट नहीं करता है!

new_query_set = query_set_1 & query_set_2 

यह तार्किक और काम करता है।

अभी भी क्वेरीज़ को घटाने का तरीका गायब है। मेरे लिए यह विश्वास करना मुश्किल है कि इसे समुदाय द्वारा सुंदरता से निपटाया नहीं गया है ...

+2

पर जाएं, फिर भी क्वेरीसेट – philgo20

+0

का उपयोग करने के लिए calssy तरीका ढूंढ रहे हैं। Exclude() ? – mccc

12

उसी मॉडल का उपयोग करके किसी अन्य क्वेरीसेट से क्वेरीरीट घटाएं।

यह काम करता है - लेकिन शायद धीरे-धीरे

queryset_with_hello = Blog.objects.filter(name__icontains='hello') 
queryset_without_hello = Blog.objects.exclude(pk__in=queryset_with_hello) 

है पढ़ें Django दस्तावेज में प्रदर्शन विचार:

https://docs.djangoproject.com/en/dev/ref/models/querysets/#in

+0

यह केवल क्वेरीसेट्स के निर्माण के दौरान काम करता है, प्रश्न ** मौजूदा ** क्वेरीसेट्स के बारे में है। जब कोई पहले से ही क्वेरीसेट के रूप में मौजूद होता है तो qs1- qs2 करने के बारे में कोई कैसे होगा। – Curtwagner1984

+0

मौजूदा क्वेरीसेट को संशोधित करना एक धारणा है जो डीजेंगो में ज्यादा समझ नहीं लेती है। ऐसा करें: 'q = Blog.objects.filter (pk__in = q1)। Exclude (pk__in = q2)' – DylanYoung

4

Django 1.11 के बाद से, क्वेरीसमूहों union(), intersection() and difference() methods.

है यह करने के लिए भी संभव है QuerySets के साथ | and & operators का उपयोग करें (मुझे वें में इसका संदर्भ नहीं मिला ई डॉक्स, तो मुझे लगता है कि union() और intersection() दो क्वेरीसेट को गठबंधन करने का पसंदीदा तरीका है।

qs3 = qs1.union(qs2)   # or qs3 = qs1 | qs2 
qs3 = qs1.intersection(qs2) # or qs3 = qs1 & qs2 
qs3 = qs1.difference(qs2) # the^operator is not implemented. 

तुम भी Q() objects उपयोग कर सकते हैं जो क्वेरीसमूहों तरह | और &, और इसके अलावा उलट लागू ऑपरेटर ~

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