我在Django中有2个模型。 ModelA和ModelB。这是这两种模型的代码。(这只是示例代码。)
class ModelA(models.Model):
# Single Insert
name=model.CharField(max_length=100)
class ModelB(models.Model):
# Multiple Insert
model_a=models.ForeignKey(ModelA,on_delete=models.CASCADE)
address=models.CharField(max_length=250)
现在我该如何在Django中使用ORM使用单个数据库查询(即数据库应仅被命中一次)在这两个模型中插入数据。更具体地说,可以通过Django REST序列化程序执行此操作,因为它可以处理CRUD优化操作。
我知道我可以通过多个序列化器来执行此操作,但是这将导致数据库多次被击中,或者我也可以通过MySQL中的存储过程来执行此操作。
答案 0 :(得分:0)
您可以使用bulk_create
和bulk_update
方法,您需要手动创建对象列表。
在您的情况下,ModelA
是父母班,ModelB
是孩子。
这意味着
ModelA
的一个对象可以与多个对象相关 的ModelB
如果您的API端点中有request.data
,则似乎是这样。
received_data = [
{
"name": "model_a_obj_1",
"children": [
{
"address" : "some_address"
},
{
"address" : "some_other_address"
}
]
}, {}, {}, ...
]
现在第一步是创建两个列表,一个子列表和一个父对象列表。
model_a_obj_list = []
model_b_children_list = []
for obj in received_data:
children_list = []
for child in obj.children:
children_list.append(ModelB(**child))
model_b_children_list.append(children_list)
model_a_obj_list.append(ModelA(name=obj.name))
现在首先创建父对象,即ModelA,然后在ModelA的实际对象上循环以将其pk
分配给相应的ModelB对象
model_a_objs = ModelA.objects.bulk_create(model_a_obj_list)
model_b_obj_list = []
for i, a_obj in enumerate(model_a_objs):
model_b_obj_sub_list = model_b_children_list[i]
for b_obj in model_b_obj_sub_list:
b_obj.model_a = a_obj
model_b_obj_list.append(b_obj)
现在,我们有了带有ModelA引用的ModelB对象。现在只需创建ModelB对象。
ModelB.objects.bulk_create(model_b_obj_list)
请记住,
bulk_create
方法在后台不使用Model类的.save()
方法,因此任何 为post_save
创建对象列表时必须计算bulk_create
逻辑此解决方案将使每个模型达到DB 2次