繁体   English   中英

Django ORM - 加入子查询

[英]Django ORM - join a subquery

我必须将此查询转换为 Django ORM,但似乎无法完成。

我尝试了我能找到的每一个注释/值/过滤器组合,但我从来没有把它变成这样的 JOIN (也没有纠正结果)。 我还没有(还)尝试定义自定义管理器。

SELECT
    t.id,
    t.name,
    dt.deadline
    dt.deal_id
FROM
    dealtask dt
    JOIN task t
    ON dt.task_id = t.id
    JOIN (
        SELECT MIN(deadline) as min_deadline, task_id
        FROM dealtask 
        GROUP BY task_id
    ) dt2
    ON dt.task_id = dt2.task_id
WHERE dt.deadline = dt2.min_deadline

我的模型如下:

class DealTask(models.Model):
    deadline = models.DateTimeField(blank=True, null=True)
    deal = models.ForeignKey('Deal', on_delete=models.CASCADE)
    task = models.ForeignKey('Task', on_delete=models.CASCADE)

class Task(models.Model):
    name = models.CharField(max_length=128)

我想查询:对于每个任务 t,与其相关的最近截止日期 DealTask​​ dt,以及与该 dt 相关的 Deal。

这个查询在 Django ORM 中可行吗? 在恒定数量的查询中,我的意思是。

此外,如果您发现表达相同内容的更简单的查询,我会全力以赴。

重现那个确切的查询会很困难。 但是,您可以在一个查询中管理结果,但生成的 sql 并不干净。 而且您无法访问所有交易属性。

Task.objects.annotate(
    deal_id=Subquery(
        DealTask.objects.filter(
            task_id=OuterRef('id')
        ).order_by('deadline').values('deal_id')[:1]
    ),
    deadline=Subquery(
        DealTask.objects.filter(
            task_id=OuterRef('id')
        ).order_by('deadline').values('deadline')[:1]
    )
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM