簡體   English   中英

在Django REST和Django中對單個數據庫中的多個模型進行多次插入/更新

[英]Doing multiple inserts/updates for multiple models in Single Database hit in Django REST and Django

我在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序列化程序執行此操作,因為它可以處理優化方式。

我知道我可以通過多個序列化器來執行此操作,但這將導致數據庫多次被擊中,或者我也可以通過MySQL中的存儲過程來執行此操作。

您可以使用bulk_createbulk_update方法,您需要手動創建對象列表。

在您的情況下, ModelA是父類,而ModelB是孩子。

這意味着ModelA一個對象可以與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方法在bulk_create不使用Model類的.save()方法,因此在為bulk_create創建對象列表時,必須計算任何post_save邏輯

該解決方案將使每個模型達到DB 2一次

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM