如何将两个不同的ListAPIView转换为单个ModelViewSet

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将两个不同的ListAPIView转换为单个ModelViewSet相关的知识,希望对你有一定的参考价值。

我有一个我正在研究的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。如果可能的话,我应该怎么做呢?

答案

你可以使用@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)

以上是关于如何将两个不同的ListAPIView转换为单个ModelViewSet的主要内容,如果未能解决你的问题,请参考以下文章

当涉及两个以上的表时,如何将来自相似字段的单个表的两个左连接转换为 LINQ? [复制]

Python:如何将 Pandas Dataframe 行值转换为单个列?

drf 中的ListAPIView视图

如何将单个表格行转换为两列?

如何将两个_pd 转换为一个_ps?

如何将子上下文中的 NSManagedObjects 的两个不同实例合并为父上下文中的单个实例