首页 > 解决方案 > DRF 序列化程序获取/发布/删除工作但“放置”失败

问题描述

我正在尝试为“项目”模型实现一个基本的 CRUD API。它在大多数情况下都有效,但我遇到了 put 方法似乎是一个小问题。我已经通过调试器多次运行它,所以我知道序列化程序至少部分功能,但似乎“更新”序列化程序方法没有成功更新我的数据库。这是视图:

    def put(self, request, *args, **kwargs):
        item = Item.objects.get(id=request.data["id"])
        serializer = ItemSerializer(item, data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这是序列化程序:

class ItemSerializer(serializers.ModelSerializer):
    """
    Item Serializer
    """

    class Meta:
        model = Item
        fields = "__all__"
        lookup_field = "id"

    def update(self, instance, validated_data):
        instance.name = validated_data.get("name", instance.name)
        instance.description = validated_data.get(
            "description", instance.description)
        instance.price = validated_data.get("price", instance.price)
        instance.discount = validated_data.get("discount", instance.discount)
        instance.quantity = validated_data.get("quantity", instance.quantity)
        instance.category = validated_data.get("category", instance.category)
        instance.save()
        return instance

这是我用来调试问题的测试(到目前为止没有成功):

    def test_update_item(self):
        self.client.force_authenticate(self.team_member)
        self.team_member.is_staff = True
        res = self.client.put(
            ITEMS_API,
            {
                "id": self.hat.id,
                "name": "Bucket Hat",
                "description": "Exclusive bucket hat"
            },
        )

        self.assertEquals(res.status_code, 200)
        self.assertEquals(hat.name, "Bucket Hat")

标签: django-modelsdjango-rest-frameworkdjango-viewsdjango-serializer

解决方案


推荐阅读