Django ORM bulk_create 1: 1 связанные модели - PullRequest
0 голосов
/ 29 ноября 2018

Я видел похожие вопросы, задаваемые, но были даны расплывчатые ответы, поэтому я буду признателен за любые отзывы.

Я хочу выполнить массовое создание для некоторых связанных объектов 1: 1.

Я надеялся, что смогу сделать что-то вроде этого:

class A(models.Model):

class B(models.Model):
    A = models.ForeignKey(A)

all_a = []
all_b = []
for i in range(10000):
    new_a = A()
    new_b = B(A=new_a)
    all_a.append(new_a)
    all_b.append(new_b)

with transaction.atomic():
    A.objects.bulk_create(all_a)
    B.objects.bulk_create(all_b)

Но я предполагаю, что модели A должны быть записаны в БД, а фактический PK возвращен и связан с моделями B, прежде чем я смогу их написать.

Кто-нибудь получил хорошее предложение о том, как сделать это эффективно?Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

В PostgreSQL это просто, поскольку bulk_create() для A заполнит pk каждого объекта *.

with transaction.atomic():
    all_a = [A() for _ in range(1000)]
    A.objects.bulk_create(all_a)

    all_b = [B(A=new_A) for new_a in all_a]
    B.objects.bulk_create(all_b)

В других базах данных это будет намного сложнее,поскольку bulk_create() не получает идентификаторы вновь созданных объектов.

Если первичный ключ модели - AutoField, он не получает и не устанавливает первичный ключатрибута, как save(), если только его не поддерживает внутренняя база данных (в настоящее время PostgreSQL).

0 голосов
/ 29 ноября 2018

Да, вам нужно заранее создать экземпляр A.Попробуйте вот так:

all_a = []
all_b = []
new_a_list = []

for i in range(10000):
    new_a = A()
    all_a.append(new_a)
with transaction.atomic():
    new_a_list = A.objects.bulk_create(all_a)

for new_a in new_a_list:
    new_b = B(A=new_a)
    all_b.append(new_b)

with transaction.atomic():
    B.objects.bulk_create(all_b)
...