Форум сайта python.su
2
имею две заполненные таблицы в двух Эксел файлах
первая длинная таблица с инвойсами (на каждого клиента несколько инвойсов)
вторая короткая таблица с клиентами
таблица с инвойсами содержит номер клиента
создал обе таблицы в Джанго - получились две несвязанные таблицы, но содержащие идентичные поля с номером клиента
теперь хочу добавить ForeignKey “fkey” в таблицу с инвойсами чтобы эти две таблицы связать
Как добавить информацию в это новое поле “fkey”
подозреваю что можно сделать одной командой - заполнить поле “fkey” сразу для всех записей в таблице инвойсов.
подскажите пожалуйста
Отредактировано gtlhbkkj (Март 17, 2020 23:56:55)
Офлайн
22
А оно точно надо “одной командой”?
Сделать по-простому - сделать запрос к таблице Clients (таким образом получить словарь вида {client_nr:id}), а потом пройтись в цикле по записям в Invoices и честно их обновить по одной.
Но если хочется поизвращаться с “одной командой”… Есть такое Джанго-расширение django-bulk-update, вроде, с его помощью можно такое попытаться сделать.
P.s.
О, оказыватеся, начиная с версии 2.2 bulk_update есть в Джанго из коробки, тогда и расширение не нужно.
Отредактировано Striver (Март 18, 2020 07:13:06)
Офлайн
2
Striverто что в цикле можно сделать, это древний метод - здесь все ясно.
А оно точно надо “одной командой”?
Офлайн
22
Мне кажется что где-то видел что можно сделать одной командой.Так я тебе и написал про это. bulk_update - это та самая “одна команда”. Ну, в смысле, питоновских команд, конечно, больше, нужно будет заполнить поля fkey всех объектов, но запись в базу потом можно сделать за один раз этой самой bulk_update. Но это нужно, если эти действия будут постоянно происходить, для производительности, а если просто разово заполнить и забыть, то нет никакого смысла так заморачиваться.
Офлайн
16
client_nr в инвойсе по логике лишний.
fkey заменить на client
По хорошему при импорте из экселя задумываться над оптимизацией смысла нет. А вот над правильной вставкой данных - есть.
client, created = Clients.objects.get_or_create(client_nr=excel_row['client']) Invoices.objects.create(client=client, ....) )
Отредактировано VadimK (Март 19, 2020 12:25:04)
Офлайн
2
VadimKclient_nr попадает в обе таблицы базы данных при экспорте из эксел файла
client_nr в инвойсе по логике лишний.
Офлайн
568
gtlhbkkj
Блин, парни…. 
UPDATE
I
SET
I.fkey = C.id,
FROM
Invoces as I
INNER JOIN Clients as C
ON I.client_nr = C.client_nr
Офлайн
2
FishHookну да точно, а в джанго как это выглядеть дожно?
gtlhbkkjБлин, парни….
Офлайн
568
> ну да точно, а в джанго как это выглядеть дожно?
А при чем тут джанго? Создайте правильные модели согласно документации Джанго, и тогда вам не набо будет лезть в SQL. Вы сделали таблицы, которые не поддерживает ОРМ фреймворка, теперь вы хотите их привести в соответствие. Ну вам придется использовать средства СУБД для этого.
Офлайн
2
FishHookясно
> ну да точно, а в джанго как это выглядеть дожно?А при чем тут джанго? Создайте правильные модели согласно документации Джанго, и тогда вам не набо будет лезть в SQL. Вы сделали таблицы, которые не поддерживает ОРМ фреймворка, теперь вы хотите их привести в соответствие. Ну вам придется использовать средства СУБД для этого.
Офлайн