Python django将queryset与queryset值区分开来
我有一个Python django将queryset与queryset值区分开来,python,django,django-queryset,distinct,Python,Django,Django Queryset,Distinct,我有一个用户,可以有多个帐户s。每个帐户上可以有多个单元s。 我建立了一个过滤字典,并得到了相关的单位: units = Unit.objects.filter(**unit_filter) 然而,我也希望得到不同的用户。我可以很容易地获得他们的身份证: user_dicts = units.values('account__user').distinct() 或者更确切地说: user_ids = [rec.get('account__user') for rec in
用户
,可以有多个帐户
s。每个帐户上可以有多个单元
s。
我建立了一个过滤字典,并得到了相关的单位:
units = Unit.objects.filter(**unit_filter)
然而,我也希望得到不同的用户。我可以很容易地获得他们的身份证:
user_dicts = units.values('account__user').distinct()
或者更确切地说:
user_ids = [rec.get('account__user') for rec in
units.values('account__user').distinct()]
因此,我可以使用User.objects.filter(id\uu in=User\u id)
过滤用户。(我也可以使用生成器表达式代替列表理解,但这不是重点。)
我不确定,但在
中评估id在我看来不是很有效。有没有更好的方法从过滤单元中获取唯一用户
编辑:
我添加了SQL查询(没有测试它们,可能是错误的),以明确我在Django ORM中的意图。实际上,我试图使用JOIN
而不是WHERE
子句
我希望:
WITH selected_units AS
(SELECT id, account_id FROM units)
SELECT DISTINCT u.id FROM user u
JOIN account a on a.user_id=u.id
JOIN unit ut ON ut.account=a.id
JOIN selected_units s ON s.id=ut.id;
但是在id\u中
我得到了以下结果:
WITH selected_units AS
(SELECT id, account_id FROM units)
SELECT DISTINCT u.id FROM user u
JOIN account a on a.user_id=u.id
JOIN unit ut ON ut.account_id=a.id
WHERE ut.id IN (SELECT id FROM selected_units);
我认为您可以使用子查询来完成此操作,例如:
User.objects.filter(account__unit__in=units)
或者不那么漂亮:
User.objects.filter(id__in=units.values_list('account__user__id', flat=True))
我认为您可以使用子查询来完成此操作,例如:
User.objects.filter(account__unit__in=units)
或者不那么漂亮:
User.objects.filter(id__in=units.values_list('account__user__id', flat=True))
您好,谢谢您的回复。我过去使用过values\u list()
,没有意识到我可以使用flat=True
然后使用distinct()
。然而,在
测试中总是有这个id,尽管它看起来有点整洁。我在问题中添加了sql查询,以便更清楚地了解我的意图。您好,谢谢您的回答。我过去使用过values\u list()
,没有意识到我可以使用flat=True
然后使用distinct()
。然而,在
测试中总是有这个id,尽管它看起来有点整洁。我在问题中添加了sql查询,以便更清楚地了解我要做的事情。