Django массовое обновление списка объектов
Я хочу создать конечную точку 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 делает именно то, что я хочу и описано в оригинальном сообщении.