2012-10-05 20 views
6

छानने सरलता के लिए मान लीजिए कि मैं केवल 2 मॉडल जाने: पुस्तक, लेखकDjango कई चौराहे के लिए कई

class Author(models.Model): 
    name = models.CharField(max_length='100') 
    ... 

class Book(models.Model): 
    name = models.CharField(max_length='100') 
    authors = models.ManyToManyField(Author) 
    ... 

मैं लेखकों की एक सूची का उपयोग कर पुस्तकें फ़िल्टर करना चाहते हैं। मैंने जो करने की कोशिश की है वह है:

authors = [...] # a list of author objects 
Books.objects.filter(authors__in=authors) 

लेकिन यहां लेखकों को ऑर्ड किया जाएगा जब मैं उन्हें एंडेड चाहता हूं। क्या कोई और कई फ़िल्टरिंग करने का कोई तरीका है ??

उत्तर

7

आप एक साथ क्यू वस्तुओं का एक समूह & सकता है:

q = Q() 
for author in authors: 
    q &= Q(authors=author) 
Books.objects.filter(q) 

किताबें है कि सूची के बाहर लेखकों निकालने के लिए आपको वास्तव में सूची में लेखकों की संख्या के साथ पुस्तकों के लिए क्वेरी सीमित हो सकती है:

Books.objects.annotate(count=Count('authors')).filter(count=len(authors)).filter(q) 

अद्यतन:

टिप्पणियों के आधार पर, मुझे लगता है कि आवश्यकता टी है o सूची में कम से कम एक लेखक द्वारा लिखी गई सभी पुस्तकों को प्राप्त करें, लेकिन सूची के बाहर किसी भी लेखकों के साथ पुस्तकें बहिष्कृत करें।

तो हम लेखकों है कि हम नफरत का चयन एक क्वेरीसमूह निर्माण:

# get all books without any of the bad_authors 
Books.objects.exclude(authors__in=bad_authors) 

यह किसी ने लिखी को छोड़कर अन्य सभी पुस्तकों वापस आ जाएगी:

# this queryset will be embedded as a subquery in the next 
bad_authors = Author.objects.exclude(name__in=['A1', 'A2']) 

फिर उन्हें किताबें हम चाहते हैं खोजने के लिए बाहर निकालने के आपकी सूची के बाहर।

Books.objects.exclude(authors__in=bad_authors).exclude(authors=None) 

यह सिर्फ एक या अच्छे के और अधिक द्वारा लिखित पुस्तकें के साथ हमें छोड़ देंगे: यदि आप भी कोई सूचीबद्ध लेखकों के साथ उन लोगों को बाहर निकालना चाहते हैं, तो एक और को बाहर कॉल जोड़ने!

+0

यह कमाल है! thanx। –

+0

एक और बात: मैं उन पुस्तकों को फ़िल्टर करने में सक्षम होना चाहता हूं जिनके पास केवल सूची से लेखक हैं, कोई अतिरिक्त लेखक नहीं। क्या आप उस plz के साथ मेरी मदद कर सकते हैं? –

+0

@CodePirate: मैंने एक उदाहरण के साथ जवाब अद्यतन किया है। – dokkaebi

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

  • कोई संबंधित समस्या नहीं^_^