Django ORM - присоединиться к подзапросу - PullRequest
0 голосов
/ 10 февраля 2020

Мне нужно перевести этот запрос в Django ORM, но, похоже, я не могу его найти.

Я пытался найти любую комбинацию аннотаций / значений / фильтров, которую смог найти, но я так и не получил ее. чтобы присоединиться, как это (ни для исправления результатов). Я (пока) не пытался определить собственный менеджер.

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, связанный с ним, и Deal, связанный с этим dt.

Возможен ли этот запрос в Django ORM? Я имею в виду постоянное число запросов.

Кроме того, если вы найдете более простой запрос, выражающий одно и то же, я весь слух.

1 Ответ

0 голосов
/ 11 февраля 2020

Будет очень сложно воспроизвести этот точный запрос. Тем не менее, вы можете управлять результатами в одном запросе, но сгенерированный 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]
    )
)
...