DRF - 查询参数验证的基本视图集

时间:2016-04-08 17:27:37

标签: django django-rest-framework django-1.9

我正在使用Django 1.9和Django Rest Framework 3.3

我创建了三个相似但仍然不同的新端点,我希望它们成为自己的视图集以避免混乱的代码。它们没有模型支持,所以我直接扩展ViewSet。所有三个端点之间的一个相似之处是它们需要相同的两个查询参数。所以我发现我这样做了:

class MyFirstViewset(viewsets.ViewSet):

    def list(self, request):
        some_param = request.query_params.get('someparam')
        if not some_param:
            return Response('someparam query parameter is required', status.HTTP_400_BAD_REQUEST)
        some_other_param = request.query_params.get('someotherparam')
        if not some_other_param:
              return Response('someotherparam query parameter is required', status.HTTP_400_BAD_REQUEST)


class MySecondViewset(viewsets.ViewSet):

    def list(self, request):
        some_param = request.query_params.get('someparam')
        if not some_param:
            return Response('someparam query parameter is required', status.HTTP_400_BAD_REQUEST)
        some_other_param = request.query_params.get('someotherparam')
        if not some_other_param:
              return Response('someotherparam query parameter is required', status.HTTP_400_BAD_REQUEST)

正如你所看到的......它不是很干。一个明显的解决方案是继承,基本视图集执行类似的验证部分,问题是我不确定使用DRF做这样的事情的最佳实践是什么。我是否想要创建受保护的访问验证功能并调用它?但是,如果我所做的只是检查键的dict,它甚至不必在ViewSet中吗?只是让最后一个类在list()中进行验证然后在所有子视图集中调用它对我来说似乎也很奇怪,因为那时我使用list()来验证,而不是实际返回基类中的任何内容。 / p>

有谁能告诉我这样做的好方法是什么?对于这样的案例,最佳做法是什么?我用Google搜索但无法找到任何东西。任何意见,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

为什么Class Base类更好的原因之一就是你可以添加自己的派生或者至少添加MixIns,所以从纯编码的角度来看,我认为你应该只添加自己的MyBaseViewSet和有MyFirstViewsetMySecondViewset来自它。

也就是说,考虑覆盖get_queryset而不是list,并使用ListAPIView以便获得一些默认行为,只返回一个空数组或者如果你真的想要返回错误,通过例外:

class MyBaseViewSet(generics.ListAPIView):
    serializer_class = YourSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def get_queryset(self):
        some_param = self.request.query_params.get('someparam')
        if not some_param:
             raise exceptions.PermissionDenied