Django批量更新对象列表
Django bulk update list of objects
我想创建一个 API 端点,您可以在其中 PUT
对象列表,它将像这样工作:
- 如果指定了 ID,则查询该对象并尝试更新它(如果未找到给定的 ID,则显示错误)
- 如果对象没有 ID,则创建。
- 如果以前保存到此列表中的数据库中缺少任何对象,请将其从数据库中删除。
我发现但没有那样工作的东西(其中大部分根本不起作用):
https://github.com/miki725/django-rest-framework-bulk
https://www.django-rest-framework.org/api-guide/serializers/#customizing-multiple-update
django-rest 站点上的示例似乎是这样做的,但它对我不起作用。
我有一个序列化程序:
class InventoryPropertyValuesSerializer(serializers.ModelSerializer):
added_by = serializers.CharField(source='added_by.username', read_only=True)
updated_by = serializers.CharField(source='updated_by.username', read_only=True)
id = serializers.IntegerField(required=False)
class Meta:
model = InventoryPropertyValues
list_serializer_class = CustomBulkListSerializer
fields = '__all__'
ListSerializer
class CustomBulkListSerializer(serializers.ListSerializer):
def update(self, instance, validated_data):
# Maps for id->instance and id->data item.
value_mapping = {value.id: value for value in instance}
data_mapping = {item['id']: item for item in validated_data}
# Perform creations and updates.
ret = []
for value_id, data in data_mapping.items():
value = value_mapping.get(value_id, None)
if value is None:
ret.append(self.child.create(data))
else:
ret.append(self.child.update(value, data))
# Perform deletions.
for value_id, value in value_mapping.items():
if value_id not in data_mapping:
value.delete()
return ret
如果我尝试 运行,我会得到:
'QuerySet' object has no attribute 'pk'
drf-writable-nested 似乎完全符合我在原 post 中所描述的要求。
我想创建一个 API 端点,您可以在其中 PUT
对象列表,它将像这样工作:
- 如果指定了 ID,则查询该对象并尝试更新它(如果未找到给定的 ID,则显示错误)
- 如果对象没有 ID,则创建。
- 如果以前保存到此列表中的数据库中缺少任何对象,请将其从数据库中删除。
我发现但没有那样工作的东西(其中大部分根本不起作用):
https://github.com/miki725/django-rest-framework-bulk
https://www.django-rest-framework.org/api-guide/serializers/#customizing-multiple-update
django-rest 站点上的示例似乎是这样做的,但它对我不起作用。
我有一个序列化程序:
class InventoryPropertyValuesSerializer(serializers.ModelSerializer):
added_by = serializers.CharField(source='added_by.username', read_only=True)
updated_by = serializers.CharField(source='updated_by.username', read_only=True)
id = serializers.IntegerField(required=False)
class Meta:
model = InventoryPropertyValues
list_serializer_class = CustomBulkListSerializer
fields = '__all__'
ListSerializer
class CustomBulkListSerializer(serializers.ListSerializer):
def update(self, instance, validated_data):
# Maps for id->instance and id->data item.
value_mapping = {value.id: value for value in instance}
data_mapping = {item['id']: item for item in validated_data}
# Perform creations and updates.
ret = []
for value_id, data in data_mapping.items():
value = value_mapping.get(value_id, None)
if value is None:
ret.append(self.child.create(data))
else:
ret.append(self.child.update(value, data))
# Perform deletions.
for value_id, value in value_mapping.items():
if value_id not in data_mapping:
value.delete()
return ret
如果我尝试 运行,我会得到:
'QuerySet' object has no attribute 'pk'
drf-writable-nested 似乎完全符合我在原 post 中所描述的要求。