Создание объекта Django со значениями поля из эквивалента SELECT - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь выяснить, как воспроизвести следующее, используя Django - кто-нибудь поможет?

INSERT INTO table1 (table2_id, a_field)
SELECT table2.id as table2_id, table3.a_field
FROM table2
INNER JOIN table3 ON
table3.table2_id == table2.id
WHERE table2.id = 123

Если я правильно понял (не мой исходный запрос ;-)), это выполните следующие действия:

  • Создание записи в table1, где ...
  • поле с именем table2_id будет соответствовать id строки в table2 и
  • поле с именем a_field будет соответствовать полю с таким же именем в a_field в строке table3 и
  • table2 / table3 объектов, из которых эти значения являются чтение идентифицируется общим отношением table2.id / table3.table_id2, а также table2 id, являющимся 123.

Я не вижу, как такие "вычисленные" значения поля могут передаваться команде create() или get_or_create(). Возможно ли это с помощью Q() объектов?

1 Ответ

0 голосов
/ 22 января 2020

Django модель представляет собой каркас ORM. В ORM, вам необходимо

  1. получить table2Entity
  2. создать новый table1Entity со значением table2Entity и связанными со значением table3Entity
  3. сохранить table1Entity

    def batch_save_entity2():
        entity2 = Table2Entity.objects.get('123')
        entity1 = Table1Entity()
        entity1.table2_id = entity2.id
        entity1.a_field = entity2.entity3.a_field
        entity1.save()
    

или просто выполнить sql напрямую без ORM

from django.db import connection

def my_custom_sql(self):
    with connection.cursor() as cursor:
        cursor.execute('''
INSERT INTO table1 (table2_id, a_field)
SELECT table2.id as table2_id, table3.a_field
FROM table2
INNER JOIN table3 ON
table3.table2_id == table2.id
WHERE table2.id = 123''')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...