Найти - Пользователи
Полная версия: Простой вопрос по Django Models
Начало » Python для новичков » Простой вопрос по Django Models
1
gtlhbkkj
имею две заполненные таблицы в двух Эксел файлах
первая длинная таблица с инвойсами (на каждого клиента несколько инвойсов)
вторая короткая таблица с клиентами

таблица с инвойсами содержит номер клиента
создал обе таблицы в Джанго - получились две несвязанные таблицы, но содержащие идентичные поля с номером клиента


теперь хочу добавить ForeignKey “fkey” в таблицу с инвойсами чтобы эти две таблицы связать


Как добавить информацию в это новое поле “fkey”
подозреваю что можно сделать одной командой - заполнить поле “fkey” сразу для всех записей в таблице инвойсов.
подскажите пожалуйста

Striver
А оно точно надо “одной командой”?
Сделать по-простому - сделать запрос к таблице Clients (таким образом получить словарь вида {client_nr:id}), а потом пройтись в цикле по записям в Invoices и честно их обновить по одной.

Но если хочется поизвращаться с “одной командой”… Есть такое Джанго-расширение django-bulk-update, вроде, с его помощью можно такое попытаться сделать.

P.s.
О, оказыватеся, начиная с версии 2.2 bulk_update есть в Джанго из коробки, тогда и расширение не нужно.
gtlhbkkj
Striver
А оно точно надо “одной командой”?
то что в цикле можно сделать, это древний метод - здесь все ясно.
Мне кажется что где-то видел что можно сделать одной командой.
Может действительно надо перекреститься и сделать тупо в цикле.
Striver
Мне кажется что где-то видел что можно сделать одной командой.
Так я тебе и написал про это. bulk_update - это та самая “одна команда”. Ну, в смысле, питоновских команд, конечно, больше, нужно будет заполнить поля fkey всех объектов, но запись в базу потом можно сделать за один раз этой самой bulk_update. Но это нужно, если эти действия будут постоянно происходить, для производительности, а если просто разово заполнить и забыть, то нет никакого смысла так заморачиваться.
VadimK
client_nr в инвойсе по логике лишний.
fkey заменить на client

По хорошему при импорте из экселя задумываться над оптимизацией смысла нет. А вот над правильной вставкой данных - есть.
 client, created = Clients.objects.get_or_create(client_nr=excel_row['client'])
Invoices.objects.create(client=client, ....)
)
gtlhbkkj
VadimK
client_nr в инвойсе по логике лишний.
client_nr попадает в обе таблицы базы данных при экспорте из эксел файла
именно по этому полю нужно связать таблицы
когда связи будут построены, ето поле естественно будет из инвойсов удалено
вопрос в том, можно ли построить связи одной командой, а не набором команд в цикле

то есть воображаемая команда должна вроде выглядеть так
“заменить в таблице Invoices поле fkey на QuerySet is таблицы Clients если номера клиентов совпадают”
FishHook
gtlhbkkj

Блин, парни….

UPDATE
I
SET
I.fkey = C.id,
FROM
Invoces as I
INNER JOIN Clients as C
ON I.client_nr = C.client_nr
gtlhbkkj
FishHook
gtlhbkkjБлин, парни….
ну да точно, а в джанго как это выглядеть дожно?
FishHook
> ну да точно, а в джанго как это выглядеть дожно?
А при чем тут джанго? Создайте правильные модели согласно документации Джанго, и тогда вам не набо будет лезть в SQL. Вы сделали таблицы, которые не поддерживает ОРМ фреймворка, теперь вы хотите их привести в соответствие. Ну вам придется использовать средства СУБД для этого.
gtlhbkkj
FishHook
> ну да точно, а в джанго как это выглядеть дожно?А при чем тут джанго? Создайте правильные модели согласно документации Джанго, и тогда вам не набо будет лезть в SQL. Вы сделали таблицы, которые не поддерживает ОРМ фреймворка, теперь вы хотите их привести в соответствие. Ну вам придется использовать средства СУБД для этого.
ясно
спасибо
вы великолепный профессионал
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB