2011-01-14 23 views
13

मेरे पास एक तृतीय-पक्ष फ़ंक्शन है जो मुझे फ़िल्टर किए गए क्वेरीसेट (जैसे 'मान्य' = True के साथ रिकॉर्ड देता है) लेकिन मैं एक विशेष स्थिति को हटाना चाहता हूं (उदाहरण के लिए सभी रिकॉर्ड, वैध और अमान्य दोनों)।Django: एक क्वेरीसेट से फ़िल्टर स्थिति हटाएं

क्या पहले से फ़िल्टर किए गए क्वेरीसेट में फ़िल्टर स्थिति को निकालने का कोई तरीका है?

उदा।

only_valid = MyModel.objects.filter(valid=True) 
all_records = only_valid.**remove_filter**('valid') 

(मुझे पता है कि यह पहले 'only_valid' 'all_records' को परिभाषित करने के लिए बेहतर होगा, लेकिन यह सिर्फ एक उदाहरण है ...)

+0

आप कोड उदाहरण के लिए, कृपया दिखा सकते हैं? –

उत्तर

4

the docs से:

हर बार आप एक क्वेरीसेट को परिशोधित करते हैं, आपको एक नया-नया QuerySet मिलता है जो पिछले क्वेरीसेट से किसी भी तरह से बाध्य नहीं होता है। प्रत्येक परिष्करण एक अलग और विशिष्ट क्वेरीसेट बनाता है जिसे संग्रहीत, उपयोग और पुन: उपयोग किया जा सकता है।

मुझे संदेह है कि ऐसा करने का एक मानक तरीका है। आप dig into the code देख सकते हैं, देखें, filter() क्या करता है और थोड़ा प्रयास करता है। अगर इससे मदद नहीं मिलती है, तो मेरी धारणा है कि आप भाग्य से बाहर हैं और खुद को क्वेरी को फिर से बनाने की जरूरत है।

10

हालांकि फिल्टर नोटेशन का उपयोग करके ऐसा करने का कोई आधिकारिक तरीका नहीं है, तो आप इसे आसानी से Q-नोटेशन के साथ कर सकते हैं। उदाहरण के लिए, यदि आप यह सुनिश्चित करें कि तीसरे भाग समारोह एक क्यू वस्तु, न किसी फ़िल्टर किए गए क्वेरीसमूह देता है, आप निम्न कर सकते हैं:

q = ThirdParty() 
q = q | Q(valid=False) 

और जिसके परिणामस्वरूप एसक्यूएल शर्तों का उपयोग OR ऑपरेटर शामिल किया जाएगा।

+0

आपको तीसरे पक्ष के कोड तक पहुंच की आवश्यकता होगी, लेकिन हाँ, यह एक अच्छा समाधान है। +1 – Boldewyn

1

यहां मैंने इसी तरह के मामले में किया है।

all_records = MyModel.objects.all() 
only_valid = MyModel.objects.filter(valid=True) 
only_valid.original = all_records 

... 

all_records = only_valid.original 

स्पष्ट रूप से यह किसी अन्य फ़िल्टर को भी साफ़ करता है, इसलिए यह हर मामले के लिए सही नहीं होगा।

0

मुझे स्रोत कोड बोल्डविन की जांच करने के लिए धन्यवाद। तो, ऐसा लगता है वहाँ सही ही मानकों के साथ फिल्टर() के नीचे एक नई विधि ... कहा जाता exclude() (के रूप में प्रतिबद्ध मिनी हैश ef6c680, जब वह अपने लाइन नंबर खो देता है के लिए)

वापसी एक नया क्वेरीसमूह उदाहरण मौजूदा सेट में नहीं (तर्क) एंडेड के साथ।

तो, मूल सवाल का जवाब देने:

only_valid = MyModel.objects.filter(valid=True) 
filtered_results = only_valid.exclude(the_condition_to_remove=True) 
+0

'बहिष्कृत करें' मौजूदा लोगों को रखते हुए, एक और फ़िल्टर जोड़ता है। यह पूर्ण क्वेरीसेट बहाल नहीं करता है। – Don

+0

ओह, मैं देखता हूँ! मैंने तब सवाल गलत समझा। इसे साफ करने के लिए धन्यवाद :) – iddy

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