Django ORM-加入子查询

时间:2020-02-10 20:28:55

标签: python django django-models django-orm

我必须将此查询转换为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中可以执行此查询吗?我的意思是恒定数量的查询。

此外,如果您找到一个表达相同意思的简单查询,我就会不知所措。

1 个答案:

答案 0 :(得分:0)

要重现该确切查询将非常困难。但是,您可以在一个查询中管理结果,但是生成的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]
    )
)
相关问题