Django ManyToMany filter()

我有一个模型:

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

我需要构build一个filter:

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

它必须是用户的filter,它必须是一个单一的filter参数。 原因是我正在构造一个URL查询string来过滤pipe理用户更改列表: http://myserver/admin/auth/user/?zones=3

这似乎应该是简单的,但我的大脑不合作!

只是重申托马斯所说的话。

在多对多和多对一testing中有很多FOO__in=...样式filter的例子。 这里是你的具体问题的语法:

 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]) 

在使用查询集时,双下划线(__)语法在整个地方使用。

请注意,如果用户可能位于查询中使用的多个区域中,则可能需要添加.distinct()。 否则你多次获得一个用户:

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