Невозможно обновить данные в базе данных с помощью метода патча в django

У меня есть модель элементов, и мне нужно написать CRUD-операции с данными. Post и get работают, а patch - нет, и я не могу понять, почему serializers.py

class CreateItemSerializer(serializers.ModelSerializer):
    photo = serializers.ImageField(max_length=None, allow_empty_file=True, allow_null=True)
    class Meta:
        model = CreateItem
        fields = '__all__'


    def create(self, validated_data):
        items = CreateItem.object.create_item(
            name = validated_data.get('name'),
            description = validated_data.get('description'),
            type_item = validated_data.get('type_item'),
            photo=validated_data.get('photo')
        )
        return items
    
    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.description = validated_data.get('description', instance.description)
        instance.type_item = validated_data.get('type_item', instance.type_item)
        instance.photo = validated_data.get('photo', instance.photo)
        instance.save()
        return instance

views.py

class CreateItemView(APIView):
    serializer_class = CreateItemSerializer
    def post(self, request):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(_('item created successfully'), status=status.HTTP_201_CREATED)
    
    def get(self, request, pk, format=None):
        item = [item.name for item in CreateItem.object.all()]
        description = [item.description for item in CreateItem.object.all()]
        type_item  = [item.type_item  for item in CreateItem.object.all()]

        return Response({'name':item[pk], 'description':description[pk], 'type_item':type_item[pk]}, status=status.HTTP_200_OK)

    def patch(self, request, pk):
        serializer = CreateItemSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        return Response(_("item updated successfully"), status=status.HTTP_200_OK)

когда я вызываю метод патча, "все работает", но данные не изменяются

Логика метода сохранения отличается в зависимости от параметра, который вы передали при создании объекта DRF Serializer.

В случае метода патча это процесс модификации существующего экземпляра.

Поэтому, создавая Serializer в методе patch, нужно пересылать не только данные, отправленные клиентом, но и экземпляры, которые вы хотите изменить.

Однако при создании объекта сериализатора в вашем патч-методе в качестве аргумента (request.data) передается только значение, полученное от клиента.

class CreateItemView(APIView):
    serializer_class = CreateItemSerializer

    def patch(self, request, pk):
        serializer = CreateItemSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        return Response(_("item updated successfully"), status=status.HTTP_200_OK)

И метод обновления Serializer также не вызывается, потому что он не вызывает метод сохранения Serializer.

from django.shortcuts import get_object_or_404

class CreateItemView(APIView):
    serializer_class = CreateItemSerializer

    def patch(self, request, pk):
        instance = get_object_or_404(CreateItem, id=pk)
        serializer = CreateItemSerializer(instance, data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(_("item updated successfully"), status=status.HTTP_200_OK)

И я думаю, что вы пытаетесь выполнить частичное обновление, поскольку вы использовали метод патча.

Если Serializer хочет получить частичное обновление, вы можете передать параметр частичного обновления в True.

from django.shortcuts import get_object_or_404

class CreateItemView(APIView):
    serializer_class = CreateItemSerializer

    def patch(self, request, pk):
        instance = get_object_or_404(CreateItem, id=pk)
        serializer = CreateItemSerializer(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(_("item updated successfully"), status=status.HTTP_200_OK)

Обратитесь к этой статье.

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