Уведомления

Группа в Telegram: @pythonsu

#1 Март 17, 2020 22:47:52

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Простой вопрос по Django Models

имею две заполненные таблицы в двух Эксел файлах
первая длинная таблица с инвойсами (на каждого клиента несколько инвойсов)
вторая короткая таблица с клиентами

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


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


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

Отредактировано gtlhbkkj (Март 17, 2020 23:56:55)

Офлайн

#2 Март 18, 2020 07:09:59

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Простой вопрос по Django Models

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

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

P.s.
О, оказыватеся, начиная с версии 2.2 bulk_update есть в Джанго из коробки, тогда и расширение не нужно.



Отредактировано Striver (Март 18, 2020 07:13:06)

Офлайн

#3 Март 18, 2020 14:41:10

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Простой вопрос по Django Models

Striver
А оно точно надо “одной командой”?
то что в цикле можно сделать, это древний метод - здесь все ясно.
Мне кажется что где-то видел что можно сделать одной командой.
Может действительно надо перекреститься и сделать тупо в цикле.

Офлайн

#4 Март 19, 2020 06:53:27

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Простой вопрос по Django Models

Мне кажется что где-то видел что можно сделать одной командой.
Так я тебе и написал про это. bulk_update - это та самая “одна команда”. Ну, в смысле, питоновских команд, конечно, больше, нужно будет заполнить поля fkey всех объектов, но запись в базу потом можно сделать за один раз этой самой bulk_update. Но это нужно, если эти действия будут постоянно происходить, для производительности, а если просто разово заполнить и забыть, то нет никакого смысла так заморачиваться.



Офлайн

#5 Март 19, 2020 12:24:34

VadimK
Зарегистрирован: 2013-07-03
Сообщения: 199
Репутация: +  16  -
Профиль   Отправить e-mail  

Простой вопрос по Django Models

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)

Офлайн

#6 Март 19, 2020 13:16:04

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Простой вопрос по Django Models

VadimK
client_nr в инвойсе по логике лишний.
client_nr попадает в обе таблицы базы данных при экспорте из эксел файла
именно по этому полю нужно связать таблицы
когда связи будут построены, ето поле естественно будет из инвойсов удалено
вопрос в том, можно ли построить связи одной командой, а не набором команд в цикле

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

Офлайн

#7 Март 19, 2020 13:25:48

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Простой вопрос по Django Models

gtlhbkkj

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

UPDATE
I
SET
I.fkey = C.id,
FROM
Invoces as I
INNER JOIN Clients as C
ON I.client_nr = C.client_nr



Офлайн

#8 Март 19, 2020 13:37:58

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Простой вопрос по Django Models

FishHook
gtlhbkkjБлин, парни….
ну да точно, а в джанго как это выглядеть дожно?

Офлайн

#9 Март 19, 2020 14:33:16

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Простой вопрос по Django Models

> ну да точно, а в джанго как это выглядеть дожно?
А при чем тут джанго? Создайте правильные модели согласно документации Джанго, и тогда вам не набо будет лезть в SQL. Вы сделали таблицы, которые не поддерживает ОРМ фреймворка, теперь вы хотите их привести в соответствие. Ну вам придется использовать средства СУБД для этого.



Офлайн

#10 Март 19, 2020 14:38:00

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Простой вопрос по Django Models

FishHook
> ну да точно, а в джанго как это выглядеть дожно?А при чем тут джанго? Создайте правильные модели согласно документации Джанго, и тогда вам не набо будет лезть в SQL. Вы сделали таблицы, которые не поддерживает ОРМ фреймворка, теперь вы хотите их привести в соответствие. Ну вам придется использовать средства СУБД для этого.
ясно
спасибо
вы великолепный профессионал

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version