drf 中的ListAPIView视图
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了drf 中的ListAPIView视图相关的知识,希望对你有一定的参考价值。
参考技术A写一个类继承 ListAPIView 返回列表数据
这样就实现了返回列表数据,如何实现的,首先查看 ListAPIView 类,发现它只有一个 get 方法,调用了 self.list() 方法
self.list() 方法在我们自己写的 MyAPIView 中并没有实现,所以这时候看 ListAPIView 的父类, ListAPIView 有两个父类和 GenericAPIView ,根据继承顺序先看 mixins.ListModelMixin ,发现有 list 方法
这里面调用了 self.filter_queryset() 方法, self.get_queryset() 方法, self.paginate_queryset() 方法, self.get_serializer() 方法, self.get_paginated_response() 方法,最终返回了列表数据,而这些方法在我们自己写的 MyAPIView 以及 ListAPIView 、 mixins.ListModelMixin 中都没有定义,这时候我们看 ListAPIView 的另一个父类
看到这里,在 GenericAPIView 这个类中,将我们所有的方法都已经帮我们实现了,我们只需要定义两个属性就可以完成列表数据的展示,在 settings 配置文件中指定分页类就可以实现分页效果
如何将两个不同的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)
以上是关于drf 中的ListAPIView视图的主要内容,如果未能解决你的问题,请参考以下文章