Http 使用DjangoRestFramework放置请求

Http 使用DjangoRestFramework放置请求,http,django-rest-framework,put,Http,Django Rest Framework,Put,我正在构建一个RESTAPI,我想知道HTTP的最佳实践,以及这将如何应用于DRF。在发送PUT请求时,在主体中,请求是否具有它们将要处理的对象的所有参数?即使不是所有人都在改变?或者他们只发送正在更新的字段?因此,例如,如果我们有一个房屋对象,其中包含房间数和楼层,并且我正在更改房间数,我应该只发送该参数,还是同时发送这两个参数 如果请求只包含正在更新的字段,那么如何将其转换为Djangorest框架?任何帮助都将不胜感激 我的看法是: class HouseDetail(generics.

我正在构建一个RESTAPI,我想知道HTTP的最佳实践,以及这将如何应用于DRF。在发送PUT请求时,在主体中,请求是否具有它们将要处理的对象的所有参数?即使不是所有人都在改变?或者他们只发送正在更新的字段?因此,例如,如果我们有一个
房屋
对象,其中包含
房间数
楼层
,并且我正在更改
房间数
,我应该只发送该参数,还是同时发送这两个参数

如果请求只包含正在更新的字段,那么如何将其转换为Djangorest框架?任何帮助都将不胜感激

我的看法是:

 class HouseDetail(generics.RetrieveUpdateDestroyAPIView):
     queryset = House.objects.all()
     serializer_class = HouseSerializer 
序列化程序是:

class HouseSerializer(serializers.ModelSerializer):
    quotes = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = House
        fields = (
            'pk',
            'address',
            'quotes',
        )

PUT
用于全部资源更新,
PATCH
用于部分资源更新

因此,在您的示例中,如果您只想为您的
house detail
型号更新
房间数
,您将在
补丁
请求中发送以下有效负载:

{ "no. of rooms": "42" }
仍然可以使用
DRF
中的
PUT
请求部分更新内容(如下所述),但您只需使用
补丁
,因为它是为此创建的。您可以获得模型的
PUT
PATCH
功能,因为您已经对
泛型进行了子类化。RetrieveUpdatedStroyapiView
类并定义了序列化程序

如果在
PUT
请求中省略了一个必填字段(请参见
required
),则您将收到一个
400
状态代码,其响应类似于
{“detail”:“x field is required”}
。但是,当您通过
PATCH
请求时,会有一个
partial=True
参数传递给序列化程序,它只允许此部分更新。我们可以在
UpdateModelMixin
中看到这一点:

def partial_update(self, request, *args, **kwargs):
    kwargs['partial'] = True
    return self.update(request, *args, **kwargs)
它调用update,即:

def update(self, request, *args, **kwargs):
    partial = kwargs.pop('partial', False)
    instance = self.get_object()
    serializer = self.get_serializer(instance, data=request.data, partial=partial)
    serializer.is_valid(raise_exception=True)
    self.perform_update(serializer)
    return Response(serializer.data)
你可以查一下,我想是复制的。。