11 подписчиков
Особенности Django ORM при использовании values() и annotate()
Решал задачку в которой мне нужен был union в SQL
select 1
union
select 2
Для того, чтобы две выборки успешно объединились нужно, чтобы типы столбцов совпадали, регулировать на чистом на sql мы можем просто изменив порядок выборки
В Django за это отвечает .values() (почти всегда и отвечает, не считая текущего кейса), т.е. в каком порядке вы напишите values('id', 'name') так селект и построится.
НО не в случае, если вы до этого использовали, например .annotate(test_var=Value(1, output_field=IntegerField()))
Тогда в любом случае, какой бы порядок в values() не придерживались, первыми в выборке будут столбцы, которые уже есть в модели, и только потом значения из annotate, причем в порядке указания их в annotate, а не values()
Багу эту обсуждают 6 лет в тиките на djangoproject, даже помечен, как зарезолвенный (10 месяцев назад), но на ^4.2 точно не пофикшена, так что будьте бдительны
#советы
Около минуты
22 января 2024