我有一个项目模型,我需要用数据编写 CRUD 操作。 发布并获取作品,但修补 - 不,我不明白为什么 序列化器.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)
当我调用 patch 方法时,“一切正常”,但数据没有改变
save方法的逻辑根据创建DRF Serializer对象时传递的参数而有所不同。
对于 patch 方法来说,它是修改现有实例的过程。
这就是为什么当你在patch方法中创建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的update方法也没有被调用,因为它没有调用Serializer的save方法。
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想要部分更新,可以将partial_update参数传递为True。
并且Serializer的update方法也没有被调用,因为它没有调用Serializer的save方法。
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)