【问题标题】:DRF: how to not allow create() in SerializerDRF:如何在序列化程序中不允许 create()
【发布时间】:2020-03-05 12:26:22
【问题描述】:

我正在使用 DRF,并且有一个 ViewSet,我希望在其中允许所有可能的操作(列表、详细信息、更新、删除),create() 除外。

这是我目前拥有的:

class FooViewSet(viewsets.ModelViewSet):

    queryset = Foo.objects.order_by('-date_added').all()
    serializer_class = FooSerializer

    def create(self, request):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

    def update(self, request, pk=None):
        version = get_object_or_404(Foo, pk=pk)
        html = request.data.get('html')
        version.update_content(html)
        return Response(data={
            'id': version.id,
            'name': version.name,
            'description': version.description,
            'html': version.content,
        }, status=status.HTTP_200_OK)

我知道我可以让序列化程序从 ReadOnlyModelViewSet 继承,但我无法更新它。

那么,不允许create() 的最干净的方法是什么?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    in this answer 所述,您可以通过在任何类视图中添加http_method_names 来限制允许的方法。 http_method_names 是 Django 默认视图类中的一个属性,详细定义见this link

    以你的代码为例,如果你想排除create(参考'post'方法)操作,你可以这样做:

    class FooViewSet(viewsets.ModelViewSet):
        queryset = Foo.objects.order_by('-date_added').all()
        serializer_class = FooSerializer
        http_method_names = ['head', 'get', 'put', 'patch', 'delete']
    
    

    【讨论】:

      【解决方案2】:

      来自rest框架的代码

      class ModelViewSet(mixins.CreateModelMixin,
                     mixins.RetrieveModelMixin,
                     mixins.UpdateModelMixin,
                     mixins.DestroyModelMixin,
                     mixins.ListModelMixin,
                     GenericViewSet):
      

      你可以在没有CreateModelMixin的情况下创建你的视图

      class MyViewSet(mixins.RetrieveModelMixin,
                     mixins.UpdateModelMixin,
                     mixins.DestroyModelMixin,
                     mixins.ListModelMixin,
                     GenericViewSet):
      

      【讨论】:

        猜你喜欢
        • 2020-02-26
        • 1970-01-01
        • 2016-12-24
        • 1970-01-01
        • 2014-04-21
        • 1970-01-01
        • 2020-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多