社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

django ORM-带Max的子查询

Luke • 2 年前 • 273 次点击  

在尝试将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查询集。 有什么帮助吗?

谢谢

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/157110
 
273 次点击