【发布时间】:2020-04-15 22:54:18
【问题描述】:
我正在尝试使用延迟潜在客户对象的计数来注释用户。延迟潜在客户的计算很复杂(使用 RawSQL),使用自定义模型管理器实现。因此,我正在尝试使用子查询来实现这一点。
sq = Lead.delayed.filter(assigned_to_id=OuterRef('pk'))
User.objects.annotate(num=Count(Subquery(sq.count())))
但是,我不断收到此错误:
ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.
更新:
我尝试添加 only('id') 所以我的代码:
sq = Lead.delayed.filter(assigned_to_id=OuterRef('id')).only('id')
User.objects.annotate(num=Count(Subquery(sq)))
这生成了 sql 查询:
SELECT `auth_user`.`id`, `auth_user`.`username`, `auth_user`.`first_name`,
`auth_user`.`last_name`, COUNT((SELECT U0.`id` FROM
`lead` U0 WHERE U0.`assigned_to_id` = (`auth_user`.`id`))) AS `count`
FROM `auth_user` GROUP BY `auth_user`.`id`;
这是抛出错误:
ERROR 1242 (21000): Subquery returns more than 1 row
我想让我的查询生成为:
SELECT `auth_user`.`id`, `auth_user`.`username`, `auth_user`.`first_name`,
`auth_user`.`last_name`, (SELECT COUNT(U0.`id`) FROM `marketing_lead` U0 WHERE
(more complex conditions here) U0.`assigned_to_id` = (`auth_user`.`id`)) AS `count`
FROM `auth_user` GROUP BY `auth_user`.`id`;
如何使用 django ORM 实现这一点?
【问题讨论】:
-
我猜您的问题是您没有指定子查询的“唯一”功能。您必须使用 Lead.delayed.filter(assigned_to_id=OuterRef('pk')).only('id)。此链接也可以帮助您:stackoverflow.com/questions/43770118/…
-
@SaberSolooki 我已经更新了我的问题。仅添加后出现 SQL 错误。
-
为什么你不尝试条件聚合。我不知道您是否可以在您提到的复杂查询中使用它。在此链接中查看我的答案:stackoverflow.com/questions/59472592/…
标签: django django-models django-orm