首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django-ORM:需要区分。为什么?

Django-ORM:需要区分。为什么?
EN

Stack Overflow用户
提问于 2018-06-22 15:06:37
回答 5查看 474关注 0票数 6

我在玩django ORM

代码语言:javascript
复制
import django
django.setup()
from django.contrib.auth.models import User, Group
from django.db.models import Count

# All users
print(User.objects.all().count())
# --> 742

# Should be: All users which are in a group.
# But the result is different. I don't understand this.
print(User.objects.filter(groups__in=Group.objects.all()).count())
# --> 1731

# All users which are in a group.
# distinct needed
print(User.objects.filter(groups__in=Group.objects.all()).distinct().count())
# --> 543

# All users which are in a group. Without distinct, annotate seems to do this.
print(User.objects.filter(groups__in=Group.objects.all()).annotate(Count('pk')).count())
# --> 543

# All users which are in no group
print(User.objects.filter(groups__isnull=True).count())
# --> 199

# 199 + 543 = 742  (nice)

我不明白返回1731的第二个查询。

我知道我可以使用distinct()。

然而,在我看来,1731年就像一只虫子。

为什么下面的查询不是不同的/唯一的?

代码语言:javascript
复制
User.objects.filter(groups__in=Group.objects.all())
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-07-23 10:42:40

我假设User.groups是一个ForeignKey或其他一些关系,它将每个User与零到多个Group实例关联起来。

因此,让您感到困惑的查询:

代码语言:javascript
复制
User.objects.filter(groups__in=Group.objects.all())

该查询可以描述为:

  • 访问Group模型管理器(Group.objects)。
  • 做一个QuerySet
    • 返回所有Group实例(Group.objects.all())。

  • 访问User模型管理器(User.objects)。
  • 做一个Queryset
    • 加入到Group模型,在User.groups外键上。
    • 返回每个(User + Group)行,该行具有关联的Group

这不是“组中的所有用户”,而是“存在组的所有用户组对”。

通过查询每个多值User.groups字段,意味着查询必须包含从UserGroup行的联接

相反,你想:

  • 访问User模型管理器(User.objects)。
  • 做一个QuerySet
    • 返回所有具有groups不为空的行。

代码语言:javascript
复制
User.objects.filter(groups__isnull=False)

请注意,“所有具有非空关联组集的用户”与您所拥有的另一个示例查询(“所有没有组中的用户”)相反。

票数 3
EN

Stack Overflow用户

发布于 2018-06-22 15:18:58

原始MySQL查询如下所示:

代码语言:javascript
复制
SELECT user.id, group.id FROM user LEFT JOIN group ON user.group_id = group.id

结果将包含所有可能的用户和组组合,我想有些用户属于多个组。

票数 6
EN

Stack Overflow用户

发布于 2018-07-19 04:25:15

您正在尝试从所有组中获取所有用户,但是用户可以出现在多个组中,这就是为什么需要不同的。如果希望用户具有特定的组,而不是执行all,请尝试使用筛选器查询。

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

https://stackoverflow.com/questions/50990858

复制
相关文章

相似问题

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