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

Вернуться на верх