使用DjangoRestFramework进行PUT请求

时间:2015-08-10 23:33:19

标签: http django-rest-framework put

我正在构建一个休息API,我想知道我猜的HTTP最佳实践,以及它将如何应用于DRF。在发送PUT请求时,在正文中,请求是否具有他们将要操作的对象的所有参数?即使不是所有人都在改变?或者他们只发送正在更新的字段?例如,如果我们有一个House对象No. of roomsfloors,我正在更改No. of rooms我应该只发送该参数,还是两者都发送?

如果请求只包含正在更新的字段,那么它将如何转换为DjangoRestFramework?任何帮助将不胜感激!

我的观点是:

 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',
        )

1 个答案:

答案 0 :(得分:1)

PUT用于完整资源更新,PATCH用于部分资源更新because Fielding says so

因此,在您的示例中,如果您只想为No. of rooms模型更新HouseDetail,则可以在PATCH请求中发送以下有效内容:

{ "no. of rooms": "42" }

仍然可以使用PUT中的DRF请求部分更新内容(如下所述),但您应该只使用PATCH,因为它是为此创建的。您获得了模型的PUTPATCH功能,因为您已经将generics.RetrieveUpdateDestroyAPIView类子类化并定义了序列化程序。

如果您的PUT请求中省略了必填字段(请required查看400),那么您将收到{"detail": "x field is required"}状态代码,其响应类似PATCH 1}}。但是,当您通过partial=True请求时,会有一个UpdateModelMixin参数传递给序列化程序,该参数允许仅部分更新。我们可以看到def partial_update(self, request, *args, **kwargs): kwargs['partial'] = True return self.update(request, *args, **kwargs)

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)

调用update,即:

SELECT COUNT(*) AS n FROM TestData WHERE ID=1