簡體   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