一尘不染

Django ManyToMany filter()

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

它必须是User的过滤器,并且必须是单个过滤器参数。这样做的原因是,我正在构造URL查询字符串以过滤管理员用户变更列表:http://myserver/admin/auth/user/?zones=3

看起来应该很简单,但我的大脑却不配合!


阅读 510

收藏
2020-03-27

共1个答案

一尘不染

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

在多对多和多对一测试中,有很多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时,会在各处使用双下划线(__)语法。

2020-03-27