Например, у меня есть абстрактная модель X
и модели A
, B
и C
, унаследованные от X
(с некоторыми переопределенными полями).
Я хочу создать QuerySet, который включает в себя все A
s, B
s и C
s. Поскольку X
является абстрактным и не имеет собственного QuerySet (потому что это не таблица для обобщенного X
), я пытаюсь сделать следующее:
# annotating with a `type` integer denoting the actual type
# some_field is present in A and B, but absent in C, so we add a placeholder to allow `union`
(A.objects.all().annotate(type=models.Value(1, models.IntegerField()))
.union(B.objects.all().annotate(type=models.Value(2, models.IntegerField())))
.union(C.objects.all().annotate(some_field=models.Value(None, models.IntegerField()),
type=models.Value(3, models.IntegerField()))
)
)
Однако это не работает, поскольку порядок столбцов в сформированном запросе SQL различен для каждой части объединения (из-за переопределенных полей). Есть ли способ явно указать порядок?
P.S. Здесь я не могу использовать values()
или values_list()
, поскольку мне нужно хранить объекты модели (не словари / кортежи) в QuerySet.