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

时间:2018-10-31 08:56:54

标签: 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

假设我只想更新用户的名字。在这种情况下,我应该使用PATCH {"first_name": "New First Name"}。但是同时,PUT {"first_name": "New First Name"}似乎也以相同的方式工作,尽管不应该这样做,因为它必须验证是否指定了所有字段。至少我是这么认为的。我错了吗?如果是的话,那么在Django Rest Framework中updatepartial_update之间有什么区别,是否有任何理由要同时保留它们(因为任何其他方法都意味着要进行额外的测试,因此后一个问题是有点哲学,因为看起来人们发现这对PUT / PATCH确实令人困惑。顺便说一句,我正在使用djangorestframework==3.8.2。谢谢。

1 个答案:

答案 0 :(得分:2)

如果您查看生成的序列化程序,则会发现您没有必填字段。在这种情况下,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)