Можно ли вернуть пустые строки в .values() из набора запросов Django?

В Django, если у меня есть 2 модели:

class MyModelA(models.Model):
    column_1 = ...
    column_2 = ...
    column_3 = ...

class MyModelB(models.Model):
    column_1 = ...
    column_2 = ...
    column_3 = ...
    column_4 = ...
    column_5 = ...

Мне нужно использовать union для объединения результатов в них, но они не имеют одинакового количества столбцов. Для дополнительных столбцов мне просто нужно, чтобы MyModelA возвращала пустые строки.

Возможно ли сделать что-то подобное?

MyModelA.objects.values("column_1", Value(""), Value(""), "column_2", "column_3").union(
    MyModelB.objects.values("column_1", "column_2", "column_3", "column_4", "column_5")
)

Из docs на union

Передача различных моделей работает до тех пор, пока список SELECT одинаков во всех наборах запросов (по крайней мере, типы, имена не имеют значения, пока типы расположены в том же порядке)

Это означает, что я в основном пытаюсь составить карту:

MyModelA.column_1 --> MyModelB.column_1
""                --> MyModelB.column_2
""                --> MyModelB.column_3
MyModelA.column_2 --> MyModelB.column_4
MyModelA.column_3 --> MyModelB.column_5

Использование Value(""), как указано выше, не работает. Есть ли другой способ сделать это?

from django.db.models import F, Value

MyModelA.objects.values("column_1", column_2=Value(""), column_3=Value(""), column_4=F("column_2"), column_5=F("column_3")).union(
    MyModelB.objects.values("column_1", "column_2", "column_3", "column_4", "column_5")
)

Возможно, вам даже не понадобится F, поскольку в вашем случае имена могут не пересекаться с реальными именами столбцов.

Вернуться на верх