Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django将queryset与queryset值区分开来_Python_Django_Django Queryset_Distinct - Fatal编程技术网

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查询,以便更清楚地了解我要做的事情。