我必须将此查询转换为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中可以执行此查询吗?我的意思是恒定数量的查询。
此外,如果您找到一个表达相同意思的简单查询,我就会不知所措。
答案 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]
)
)