在Django REST和Django中对单个数据库中的多个模型进行多次插入/更新

时间:2018-08-07 05:47:35

标签: python django django-rest-framework

我在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中的存储过程来执行此操作。

1 个答案:

答案 0 :(得分:0)

您可以使用bulk_createbulk_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次