我在玩django ORM
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年就像一只虫子。
为什么下面的查询不是不同的/唯一的?
User.objects.filter(groups__in=Group.objects.all())发布于 2018-07-23 10:42:40
我假设User.groups是一个ForeignKey或其他一些关系,它将每个User与零到多个Group实例关联起来。
因此,让您感到困惑的查询:
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字段,意味着查询必须包含从User到Group行的联接。
相反,你想:
User模型管理器(User.objects)。QuerySet:groups不为空的行。
User.objects.filter(groups__isnull=False)请注意,“所有具有非空关联组集的用户”与您所拥有的另一个示例查询(“所有没有组中的用户”)相反。
发布于 2018-06-22 15:18:58
原始MySQL查询如下所示:
SELECT user.id, group.id FROM user LEFT JOIN group ON user.group_id = group.id结果将包含所有可能的用户和组组合,我想有些用户属于多个组。
发布于 2018-07-19 04:25:15
您正在尝试从所有组中获取所有用户,但是用户可以出现在多个组中,这就是为什么需要不同的。如果希望用户具有特定的组,而不是执行all,请尝试使用筛选器查询。
https://stackoverflow.com/questions/50990858
复制相似问题