首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django ManyToMany过滤器()

Django ManyToMany过滤器()
EN

Stack Overflow用户
提问于 2010-02-08 05:00:59
回答 3查看 146.4K关注 0票数 163

我有一个模型:

代码语言:javascript
复制
class Zone(models.Model):
    name = models.CharField(max_length=128)
    users = models.ManyToManyField(User, related_name='zones', null=True, blank=True)

我需要构建一个过滤器,如下所示:

代码语言:javascript
复制
u = User.objects.filter(...zones contains a particular zone...)

它必须是用户上的筛选器,并且必须是单个筛选器参数。这是因为我正在构造一个URL querystring来过滤管理员用户更改列表:http://myserver/admin/auth/user/?zones=3

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-08 11:34:58

只是重复一下Tomasz说过的话。

many-to-manymany-to-one测试中有许多FOO__in=...样式过滤器的示例。以下是针对您的特定问题的语法:

代码语言:javascript
复制
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时,到处都使用双下划线(__)语法。

票数 195
EN

Stack Overflow用户

发布于 2014-10-06 22:09:19

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

代码语言:javascript
复制
users_in_zones = User.objects.filter(zones__in=[zone1, zone2, zone3]).distinct()
票数 47
EN

Stack Overflow用户

发布于 2020-07-02 00:15:04

另一种方法是遍历中间表。我会在Django ORM中这样表达:

代码语言:javascript
复制
UserZone = User.zones.through

# for a single zone
users_in_zone = User.objects.filter(
  id__in=UserZone.objects.filter(zone=zone1).values('user'))

# for multiple zones
users_in_zones = User.objects.filter(
  id__in=UserZone.objects.filter(zone__in=[zone1, zone2, zone3]).values('user'))

如果它不需要指定.values('user')就好了,但Django (3.0.7版)似乎需要它。

上面的代码将最终生成如下所示的SQL:

代码语言:javascript
复制
SELECT * FROM users WHERE id IN (SELECT user_id FROM userzones WHERE zone_id IN (1,2,3))

这很好,因为它没有任何可能导致返回重复用户的中间连接

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2218327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档