【问题标题】:PUT requests with DjangoRestFramework使用 DjangoRestFramework 的 PUT 请求
【发布时间】:2015-08-10 23:33:18
【问题描述】:

我正在构建一个 rest API,并且想知道我猜想的 HTTP 最佳实践,以及它将如何应用于 DRF。当在正文中发送 PUT 请求时,请求是否具有它们将要操作的对象的所有参数?即使不是所有人都在改变?还是他们只发送正在更新的字段?例如,如果我们有一个带有No. of roomsfloorsHouse 对象,而我正在更改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',
        )

【问题讨论】:

  • 你可以查看answer,我认为它是重复的..

标签: http django-rest-framework put


【解决方案1】:

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

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

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

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

如果在您的PUT 请求中省略了必填字段(请参阅documentation 以获取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)

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多