[英]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_create
和bulk_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.