Django ORM bulk_create 1:1相关模型

时间:2018-11-29 07:53:33

标签: django python-3.x django-orm

我也曾问过类似的问题,但提供的答案含糊不清,希望得到您的反馈。

我想在一些相关的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 :(得分:0)

是的,您需要预先创建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)

答案 1 :(得分:0)

在PostgreSQL上,这很简单,因为bulk_create()代表A will populate每个对象的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() doesn't get the ids是新创建的对象。

  

如果模型的主键是AutoField,则它不会像save()那样检索和设置主键属性,除非数据库后端支持它(当前是PostgreSQL)。