2010-02-03 11 views
21

मुझे पता है कि डीजेंगो में फ़िल्टर और क्यू ऑब्जेक्ट्स कैसे बनाएं, लेकिन मुझे नहीं पता कि एपीआई द्वारा प्रदान किए जाने वाले ऑपरेटरों को कैसे नकारना है, उदाहरण के लिए, ऑपरेटर के लिए मुझे कुछ पसंद नहीं है।Django क्वेरी अस्वीकरण

उदा।

q=Q(name__notcontains="SomeString") 

यह मुझे उन सभी वस्तुओं को प्राप्त करेगा जिनके नाम में "कुछ स्ट्रिंग" नहीं है।

क्या कुछ वाक्यविन्यास है जो मुझे याद आ रहा है?

धन्यवाद।

उत्तर

49

आप filter() के स्थान पर exclude() उपयोग कर सकते हैं:

Entry.objects.exclude(name__contains="SomeString") 

(SomeString "मुझे सभी प्रविष्टियों युक्त names के साथ उन लोगों को छोड़कर देना" ")

और जब क्यू वस्तु आप उपयोग कर सकते हैं के साथ काम कर" ~ "क्यू ऑब्जेक्ट से पहले निषेध का प्रतिनिधित्व करने के लिए प्रतीक। उदाहरण के लिए निम्नलिखित कथन का अर्थ है" मुझे names "एलिफेंट" युक्त सभी प्रविष्टियां दें, लेकिन "कुछ स्ट्रिंग" नहीं है:

Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString")) 

कुछ मामलों में आप दोनों विधियों का उपयोग कर सकते हैं:

Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString")) 

("मुझे सभी प्रविष्टियों देते हैं, names युक्त के साथ उन लोगों को छोड़कर" हाथी ", लेकिन नहीं युक्त" SomeString ")

3

यहां QuerySet API reference है। exclude ऐसा लगता है जो आप चाहते हैं।

+0

बढ़िया! यह वही है जो मुझे चाहिए, हालांकि इसे क्यू ऑब्जेक्ट के अंदर उपयोग नहीं किया जा सकता है, कोई भी आसानी से फिल्टर को चेन कर सकता है: q = क्यू (title__contains = "SomeTerm") TheModel.objects.filter (q) .exclude (title__contains = "SomeTermWeDontWant") धन्यवाद! –

1

या तो exclude का उपयोग करें क्योंकि हांक सुझाव देता है या विशेष contains केस के लिए, क्यू (name__regex = r '! (SomeString)' का उपयोग करें) यदि आपको वास्तव में filter का उपयोग करने की ज़रूरत है। चेतावनी दी जानी चाहिए कि regex डाटाबेस-अज्ञेयवादी नहीं है, जांचें कि आपका डीबी पहले कौन सा सिंटैक्स का समर्थन करता है।