无法通过django中的patch方法更新数据库中的数据

问题描述 投票:0回答:1

我有一个项目模型,我需要用数据编写 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 方法时,“一切正常”,但数据没有改变

python django django-models django-rest-framework django-views
1个回答
0
投票

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)

请参考这篇文章。

© www.soinside.com 2019 - 2024. All rights reserved.