Невозможно обновить данные в базе данных с помощью метода патча в 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)