2010-02-07 18 views
69

मैं एक मॉडल है:Django ManyToMany फिल्टर()

class Zone(models.Model): 
    name = models.CharField(max_length=128) 
    users = models.ManyToManyField(User, related_name='zones', null=True, blank=True) 

और मैं की तर्ज पर एक फिल्टर contruct की जरूरत है:

u = User.objects.filter(...zones contains a particular zone...) 

यह उपयोगकर्ता पर एक फिल्टर हो गया है और यह है एक फिल्टर पैरामीटर होने के लिए। इसका कारण यह है कि मैं व्यवस्थापक उपयोगकर्ता परिवर्तक को फ़िल्टर करने के लिए एक यूआरएल क्वेरीस्ट्रिंग का निर्माण कर रहा हूं: http://myserver/admin/auth/user/?zones=3

ऐसा लगता है कि यह आसान होना चाहिए लेकिन मेरा दिमाग सहयोग नहीं कर रहा है!

+7

मुझे यकीन है कि अगर मैं नहीं कर रहा हूँ आप सही - है नहीं 'User.objects.filter (zones__id = )' या 'User.objects.filter (zones__in = ) 'इसके लिए अच्छा है? –

+0

यह ठीक है :) बीटीडब्ल्यू 'User.objects.filter (zones__in = ) शायद' user.objects.filter (zones__id__in = ) होना चाहिए) ' –

+10

बस किसी को भी गुगल करने के लिए इंगित करना चाहता था, यह केवल तभी काम करता है जब संबंधित_नाम सेट है ज़ोन_सेट काम नहीं करेगा, उदाहरण के लिए। उस पर एक अच्छा आधे घंटे बर्बाद कर दिया :-) –

उत्तर

77

बस टॉमसज़ ने जो कुछ कहा उसे बहाल कर दिया।

FOO__in=... शैली फिल्टर many-to-many और many-to-one परीक्षणों में कई प्रकार के उदाहरण हैं। यहाँ अपने विशिष्ट समस्या के लिए वाक्य रचना है: जब querysets के साथ काम करने

users_in_1zone = User.objects.filter(zones__id=<id1>) 
# same thing but using in 
users_in_1zone = User.objects.filter(zones__in=[<id1>]) 

# filtering on a few zones, by id 
users_in_zones = User.objects.filter(zones__in=[<id1>, <id2>, <id3>]) 
# and by zone object (object gets converted to pk under the covers) 
users_in_zones = User.objects.filter(zones__in=[zone1, zone2, zone3]) 

डबल अंडरस्कोर (__) वाक्य रचना हर जगह प्रयोग किया जाता है।

+0

दस्तावेज़ लिंक अब टूटा हुआ है, लेकिन धन्यवाद, धन्यवाद! – maxm

+0

धन्यवाद @maxm। कुछ उदाहरणों के लिए एक और वर्तमान लिंक के साथ अद्यतन किया गया। – istruble

+0

लिंक टूटा हुआ है – maazza

10

ध्यान दें कि यदि उपयोगकर्ता क्वेरी में उपयोग किए गए एकाधिक जोन में हो सकता है, तो आप शायद .distinct() जोड़ना चाहते हैं। नहीं तो आप एक उपयोगकर्ता कई बार मिलता है:

users_in_zones = User.objects.filter(zones__in=[zone1, zone2, zone3]).distinct() 
संबंधित मुद्दे