我有一个模型:
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...)
它必须是User的过滤器,并且必须是单个过滤器参数。这样做的原因是,我正在构造URL查询字符串以过滤管理员用户变更列表:http://myserver/admin/auth/user/?zones=3
看起来应该很简单,但我的大脑却不配合!
只是重申托马斯所说的话。
在多对多和多对一测试中,有很多FOO__in=...样式过滤器的示例。这是你特定问题的语法:
FOO__in=...
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])
使用querysets时,会在各处使用双下划线(__)语法。