我也曾问过类似的问题,但提供的答案含糊不清,希望得到您的反馈。
我想在一些相关的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模型相关联。
有人对如何有效地做到这一点有很好的建议吗? 预先感谢
答案 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)。