2011-12-02 5 views
7

मैं की तरह एक क्वेरीसमूह बनाने कहो। फिर मैं थिंग डीबी में कुछ नई चीजें जोड़ता हूं। पता है कि x या y हैं होने के बिनाकिसी अन्य क्वेरीसेट से क्वेरी के साथ एक django QuerySet फ़िल्टर करें: संभव है? समय t0 पर</p> <pre><code>q0 = Thing.objects.all() fq0 = q0.filter(x=y) </code></pre> <p>:

fq = (q0 | q1).filter(x=y) 

:

q1 = Thing.objects.filter(created_gt=t0) 

मैं क्वेरीसमूह उत्पन्न करना चाहते हैं: ये बातें क्वेरीसमूह के रूप में। दूसरे शब्दों में, मैं इस तरह कुछ करने में सक्षम होना चाहता हूं:

fq1 = q1.filter(query=fq0.query) 
fq = fq0 | fq1 

क्या यह संभव है? मैन्युअल रूप से

q1.query = fq0.query 

केवल q1 == fq0 सेट करता है। मैंने कुछ लोगों को एक क्वेरीसेट से एसक्यूएल निकालने के बारे में पूछते हुए देखा है, लेकिन यह वास्तव में मेरी मदद नहीं करेगा।

उत्तर

1

जहां तक ​​मैं क्वेरीसेट और क्वेरी मॉड्यूल को देखने से कह सकता हूं, Django आपके द्वारा क्वेरीसेट में भेजे गए तर्कों का एक रिकॉर्ड रिकॉर्ड नहीं रखता है। यह सबकुछ सीधे निम्न स्तर के क्वेरी टुकड़ों में अनुवाद करता है, फिर आपके द्वारा दिए गए टोकन को त्याग देता है। इस प्रकार, यह पता लगाना कि पूर्व ज्ञान के बिना एक क्वेरीसेट कैसे फ़िल्टर किया गया है, एक गैर-मामूली कार्य है।

आप इसे मैन्युअल रूप से एक साथ निम्नलिखित की तरह कुछ हैकिंग से कर सकता है:

q0 = Thing.objects.all() 
filter_kwargs = {'x': y} 
fq0 = q0.filter(**filter_kwargs) 
fq0.saved_filter_kwargs = filter_kwargs 

##### snip ##### 

fq1 = q1.filter(**fq0.saved_kwargs) 

बुरा का प्रकार यद्यपि। एक अलग तरीके से इस समस्या को हल करने की कोशिश करने के लिए शायद बेहतर है। मैं आपको एक और प्रश्न पोस्ट करने की सिफारिश करता हूं और इसमें शामिल हूं कि आप बड़ी तस्वीर में क्या हासिल करने की कोशिश कर रहे हैं, और हम आपको बेहतर वास्तुकला के साथ आने में मदद कर सकते हैं।

+0

बड़ी तस्वीर: कैश fq0, केवल q1 फ़िल्टर करके fq उत्पन्न करें। आप सही हैं कि यह एक बुरा समाधान है। जब आप चीजों को कैश कर रहे होते हैं तो यह भी नास्टियर बन जाता है। सौभाग्य से मुझे एक बेहतर समाधान मिला। यद्यपि कि आपकी इस सहायता के लिए धन्यवाद। मैं तुम्हें उखाड़ फेंक दूंगा लेकिन मुझे और अधिक प्रतिनिधि चाहिए। –

+0

@dmrparthenon आपको अपने प्रश्न का उत्तर उस समाधान के साथ देना चाहिए जो आपको कॉम्यूनिटी की मदद करने के लिए मिला है और आपके उत्तर के हल के जवाब के रूप में चिह्नित है। –

12

इन पंक्तियों के साथ कुछ के बारे में कैसे:

Thing.objects.filter(field__in=Another_queryset.object.filter())

Django क्वेरी और सबक्वेरी करेंगे।

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