我有一个User
可以有多个 Account
s。可以有多个Unit
每个 Account
上都有 s 。
我构建了一个过滤字典并获取相关单位:
units = Unit.objects.filter(**unit_filter)
但是,我也希望获得不同的用户。我可以轻松获取他们的 ID:
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__in=user_ids)
过滤用户。 (我也可以使用生成器表达式而不是列表理解,但这不是重点。)
我不确定,但正在评估id in
在我看来效率不是很高。有没有更好的方法如何从过滤的单元中获取唯一用户?
编辑:
我添加了 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_in
我明白了:
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))
关于python - django 查询集与查询集值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54578308/