Найти в Дзене
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 точно не пофикшена, так что будьте бдительны
#советы
Около минуты