Django ORM - 加入子查询

Django ORM - join a subquery

我必须将此查询转换为 Django ORM,但似乎做不到。

我尝试了所有我能找到的 annotate/values/filter 组合,但我从来没有像那样将它加入 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]
    )
)