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]
)
)
我必须将此查询转换为 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]
)
)