【问题标题】:Create custom abstract view class inherited from APIView创建从 APIView 继承的自定义抽象视图类
【发布时间】:2017-04-23 12:15:18
【问题描述】:

我正在使用 Django REST 框架模块在 Django 中工作。

对于我制作的每个模型,我都有一个看法:

class CustomAPIView(APIView):
    renderer_classes = (JSONRenderer, )
    permission_classes = (IsAuthenticated, )

    @csrf_exempt
    def post(self, request):
        raw_data = serializers.SearchStateSerializer(data=request.data)
        if raw_data.is_valid():
            searched_data = serializers.ShowStateSerializer(data=serializers.State.objects.extra(where=raw_data.data['where'], order_by=raw_data.data['order_by']), many=True)
            return JsonResponse(paginate_data(searched_data=searched_data, request_data=raw_data), status=status.HTTP_202_ACCEPTED)

        else:
            return JsonResponse(raw_data.errors, status=status.HTTP_400_BAD_REQUEST)

在这段代码中,有 3 个约束发生了变化:

  1. SearchStateSerializer
  2. ShowStateSerializer
  3. 状态(模型)

所以我想创建一个摘要,其中我只指定这 3 件事并且视图有效。我怎样才能做到这一点?我搜索了很多,但没有运气。必须提供这三个约束,否则会抛出错误。

【问题讨论】:

    标签: django python-3.x django-views django-rest-framework


    【解决方案1】:

    使用它作为你的父类:

    class CustomAPIView(APIView):
        renderer_classes = (JSONRenderer, )
        permission_classes = (IsAuthenticated, )
        search_state_serializer_class = None
        show_state_serializer_class = None
        state_model = None
    
    
        @csrf_exempt
        def post(self, request):
            raw_data = self.search_state_serializer_class(data=request.data)
            if raw_data.is_valid():
                searched_data = self.show_state_serializer_class(
                                    data=(self.state_model.objects
                                          .extra(where=raw_data.data['where'],
                                                 order_by=raw_data.data['order_by'])),
                                          many=True)
            return JsonResponse(paginate_data(searched_data=searched_data, request_data=raw_data), status=status.HTTP_202_ACCEPTED)
        else:
            return JsonResponse(raw_data.errors, status=status.HTTP_400_BAD_REQUEST)
    

    现在您可以简单地为类字段提供值,并且 post 方法将起作用。

    class MyView(CustomApiView):
        search_state_serializer_class = MySearchStateSerializer
        show_state_serializer_class = MyShowStateSerializer
        state_model = MyStateModel
    

    【讨论】:

    • 这是制作泛型类的方法。另一种方法是使用 get 方法,如 get_serializer_class。在这种情况下,您可以覆盖方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多