Почему Django не использует псевдоним выбора при фильтрации по аннотации? - PullRequest
4 голосов
/ 29 января 2020

Я делаю что-то не так при фильтрации аннотации на основе подзапроса? Или почему псевдоним не используется вместо вычисления подзапроса снова? Вот глупый пример, который демонстрирует мое замешательство

Foo.objects.annotate(
    progress=Subquery(
        Job.objects.annotate(ps=Sum('progress')).values('ps')[:1], 
        output_field=IntegerField()
    )
).filter(progress__gt=0)

в настоящее время становится

SELECT "foo"."id",

  (SELECT SUM(U0."progress") AS "ps"
   FROM "job" U0
   GROUP BY U0."id",
            U0."progress"
   LIMIT 1) AS "progress"
FROM "foo"
WHERE
    (SELECT SUM(U0."progress") AS "ps"
     FROM "job" U0
     GROUP BY U0."id",
              U0."progress"
     LIMIT 1) > 0

вместо просто

SELECT "foo"."id",

  (SELECT SUM(U0."progress") AS "ps"
   FROM "job" U0
   GROUP BY U0."id",
            U0."progress"
   LIMIT 1) AS "progress"
FROM "foo"
WHERE
    progress > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...