2010-02-07 74 views
69

我有一個模型:Django的多對多過濾器()

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

我需要去構造線沿線的一個過濾器:

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

它必須是對用戶的過濾器,它有成爲單個過濾器參數。原因是我正在構建URL查詢字符串來過濾管理用戶更改列表:http://myserver/admin/auth/user/?zones=3

看起來應該很簡單,但我的大腦不合作!

+7

我不知道如果我得到你的權利 - 不是'User.objects.filter(zones__id = )'或'User.objects.filter(zones__in = )'好嗎? – 2010-02-07 21:16:43

+0

沒關係:)順便說一句'User.objects.filter(zones__in = )'應該可能是'User.objects.filter(zones__id__in = )' – 2010-02-08 00:08:42

+10

只是想指出任何人使用谷歌搜索,只有當related_name已設置。例如,zone_set不起作用。浪費了一個好半小時的時間:-) – 2012-12-06 13:27:26

回答

77

只是重申托馬斯說的。

many-to-manymany-to-one測試中有FOO__in=...款式過濾器的很多例子。這裏是語法您的具體問題:與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 2012-02-13 15:43:59

+0

謝謝@maxm。用更新的鏈接更新一些示例。 – istruble 2012-02-13 17:06:13

+0

鏈接被破壞 – maazza 2013-06-10 09:48:19

10

請注意,如果用戶可能位於查詢中使用的多個區域中,則可能需要添加.distinct()。否則,你會得到一個用戶多次:

users_in_zones = User.objects.filter(zones__in=[zone1, zone2, zone3]).distinct()