如何将两个不同的ListAPIView隐藏到单个ModelViewSet中

时间:2019-01-22 02:24:33

标签: django django-models django-rest-framework

我有一个正在处理的django项目,需要用户和帐户模型。我正在使用和集成Django Rest Framework。我最初使用的是来自DRF的单个API通用视图。我正在考虑将单个通用视图转换为视图集。我能够为用户模型做到这一点。我希望将“帐户模型”视图转换为视图集。

我的问题是,对于配置文件模型,我具有相同ListAPIView的两个版本。顶部的视图列出了数据库中的所有帐户,第二个视图根据“帐户”模型中的User__Username外键列出了单个用户的所有帐户。

class UserViewSet(viewsets.ModelViewSet):
    serializer_class = UserSerializer
    queryset = User.objects.all()
    lookup_field = 'username'

class AccountListView(ListAPIView):
    queryset = Account.objects.all()
    serializer_class = AccountSerializer

class AccountUserListView(ListAPIView):
    queryset = Account.objects.all()
    serializer_class = AccountSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_fields = ('user', '_id', '_class')

    def get_queryset(self):
        return self.queryset.filter(user_username=self.kwargs.get('username'))

它表示我可以在视图集中专门定义视图的属性,但我想为单个模型定义ListAPIView的两个版本。有没有一种方法可以在单个视图集中重复定义同一视图。

我基本上想在同一个视图集中定义两个Account ListAPIViews。如果可能的话我应该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以使用@action装饰器进行定义。

class UserViewSet( mixins.ListModelMixin, viewsets.GenericViewSet):
     """
        A simple ViewSet for listing or retrieving users.
     """
   def list(self, request):
      queryset = User.objects.all()
      serializer = UserSerializer(queryset, many=True)
      return Response(serializer.data)

   @acttion(method="get", details=False, serializer_class=AccountSerializer)
   def account_list(self, request, *args, **kwargs):
       queryset = User.objects.all()
       data = self.get_serializer_class().(instance=queryset, many=True).data
       return response.Response(data)