Django REST Framework 中的 PUT 和 PATCH 之间没有区别

Gev*_*ian 6 python django django-rest-framework

这是我的简单视图集和序列化器类:

class UserSerializer(ModelSerializer):

    class Meta:
        model = User
        fields = ['id', 'email', 'first_name', 'last_name']

....    

class UserViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)

假设我只想更新我用户的名字。在那种情况下,我应该使用PATCH {"first_name": "New First Name"}. 但与此同时,它看起来PUT {"first_name": "New First Name"}也以同样的方式工作,尽管它不应该,因为它必须验证所有字段都已指定。至少我是这么认为的。我错了吗?如果我的话是什么样的区别updatepartial_updateREST框架在Django和没有任何理由让他们两个(因为任何其他方法意味着额外的测试,所以后者的问题是有点哲学,因为长得像的人觉得这PUT/PATCH 对真的很混乱)。顺便说一句,我正在使用djangorestframework==3.8.2. 谢谢你。

Lin*_*via 10

如果您查看生成的序列化程序,您会发现没有必填字段。在这种情况下,PUT 和 PATCH 将具有类似的行为。是否有任何必填字段,您会看到差异。

serializer = UserSerializer(instance=user, data={"first_name": "New First"})
print(serializer)                                                                                                                                                                                  

    UserSerializer(data={'first_name': 'New First'}, instance=<User: tester>):
        id = IntegerField(label='ID', read_only=True)
        email = EmailField(allow_blank=True, label='Email address', max_length=254, required=False)
        first_name = CharField(allow_blank=True, max_length=30, required=False)
        last_name = CharField(allow_blank=True, max_length=150, required=False)
Run Code Online (Sandbox Code Playgroud)

  • 当您显式定义它们而不提供明确的“required=False”时。对于模型自动生成的字段,情况有些不同。 (2认同)