在尝试将Django ORM与子查询和Max函数(db:PostgreSQL 15)一起使用时,我遇到了一些问题
在以下型号上:
class Task(models.Model):
declaration = models.ForeignKey(
Declaration,
null=True,
default=None,
on_delete=models.CASCADE,
related_name="tasks",
)
sequence = models.PositiveIntegerField(blank=True, null=True)
#
# other fields
我正在尝试筛选与具有最高序列的声明相关的任务
。
以下是我的尝试:
sequences = Task.objects.filter(declaration=OuterRef("declaration")).exclude(sequence__isnull=True).order_by("sequence").distinct().values("sequence")
max_sequences = sequences.annotate(max_seq=Max("sequence")).values("max_seq")
qs = Task.objects.filter(sequence=Subquery(max_sequences))
然而,迭代qs会抛出以下错误:
ProgrammingError: more than one row returned by a subquery used as an expression
检查SQL,如下所示:
SELECT "task"."id",
"task"."declaration_id",
"task"."sequence"
FROM "task"
WHERE "task"."sequence" = (
SELECT "subquery"."max_seq"
FROM (SELECT DISTINCT MAX(U0."sequence") AS "max_seq", U0."sequence"
FROM "task" U0
WHERE (U0."declaration_id" = ("task"."declaration_id") AND
NOT (U0."sequence" IS NULL))
GROUP BY U0."sequence"
ORDER BY U0."sequence" ASC) subquery)
并且执行返回相同的错误。
正在添加
LIMIT 1
到第一个子查询,在dbshell上解决它:
SELECT "task"."id",
"task"."declaration_id",
"task"."sequence"
FROM "task"
WHERE "task"."sequence" = (
SELECT "subquery"."max_seq"
FROM (SELECT DISTINCT MAX(U0."sequence") AS "max_seq", U0."sequence"
FROM "task" U0
WHERE (U0."declaration_id" = ("task"."declaration_id") AND
NOT (U0."sequence" IS NULL))
GROUP BY U0."sequence"
ORDER BY U0."sequence" ASC LIMIT 1) subquery)`
但我不知道如何使用Django查询集。
有什么帮助吗?
谢谢