Как я могу указать порядок столбцов в запросе SELECT в Django ORM?
Я пытаюсь объединить элементы из двух таблиц, но, очевидно, элементы в объединении соответствуют порядку столбцов в SELECT, а не именам столбцов (даже если имена столбцов совпадают).
Рассмотрим следующие модели:
class Person(models.Model):
first_name = models.CharField(max_length=256)
last_name = models.CharField(max_length=256)
age = models.IntegerField()
class Car(models.Model):
number = models.IntegerField()
brand = models.CharField(max_length=256)
name = models.CharField(max_length=256)
и следующий фрагмент кода:
Person.objects.create(first_name="John", last_name="Smith", age=25)
Car.objects.create(number=42, name="Cybertruck", brand="Tesla")
q1 = Person.objects.all().annotate(name=F('first_name'), group=F('last_name'), number=F('age')).values(
'name', 'group', 'number')
q2 = Car.objects.all().annotate(group=F('brand')).values('name', 'group', 'number')
data = q1.union(q2)
print(data.query)
assert list(data) == [
{'name': 'John', 'group': 'Smith', 'number': 25},
{'name': 'Cybertruck', 'group': 'Tesla', 'number': 42},
])
Как видите, я поставил правильный порядок в .values()
.
Чего можно ожидать, так это того, что столбцы в объединении будут сопоставляться в порядке, передаваемом значениям (или по именам столбцов), но это происходит так:
SELECT "testunion_person"."first_name" AS "name", "testunion_person"."last_name" AS "group", "testunion_person"."age" AS "number" FROM "testunion_person" UNION SELECT "testunion_car"."name", "testunion_car"."number", "testunion_car"."brand" AS "group" FROM "testunion_car"
В запросах "testunion_car"."number"
is до "testunion_car"."brand"
, что делает Car в UNION следующими значениями: {'name': 'Cybertruck', 'group': '42', 'number': 'Tesla'}
EDIT: я использую версию 2.2 (LTS) Django