我正在使用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搜索但无法找到任何东西。任何意见,将不胜感激。谢谢!
答案 0 :(得分:1)
为什么Class Base类更好的原因之一就是你可以添加自己的派生或者至少添加MixIns,所以从纯编码的角度来看,我认为你应该只添加自己的MyBaseViewSet
和有MyFirstViewset
和MySecondViewset
来自它。
也就是说,考虑覆盖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