python - django 查询集与查询集值不同

标签 python django django-queryset distinct

我有一个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/

相关文章:

python - Python 中的字符串比较对首字母不区分大小写

jquery - 模式对话框不关闭 Bootstrap

Django只读表单字段不会出现在清理后的数据中

python - 在 Django 中上传表单出现 TypeError

python - 使用两个模型进行全文搜索

python - 值错误 : Unable to configure handler 'file' : [Errno 13] Permission denied:

python - 具有环绕条件的索引数组之间的值的 Numpy 总和

python threading.Timer 不在指定时间立即启动

python - 在 Django 中,如何使用模板和数据库对象中使用的动态 URL 实现样板 HTML 变量?

python - 给定日期后的 DatetimeField 过滤器