【DRF】视图集中GenericAPIVIew类的应用

导读:本篇文章讲解 【DRF】视图集中GenericAPIVIew类的应用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

需求1:当访问项目的列表数据时:获取所有的字段;现在访问项目的列表数据时:只展示项目名称和项目负责人,并且不分页;

方法1:无过滤、排序、分页功能

@action(methods=['GET'],detail=False)
def names(self,request):
    queryset=self.get_queryset()
    list=[]
    for query in queryset:
        list.append({
            'name':query.name,
            'leader':query.leader
        })
    return Response(list)

方法2:无过滤、排序、分页功能

    @action(methods=['GET'],detail=False)
    def names(self,request):
        queryset=self.get_queryset()
        serializer=self.get_serializer(instance=queryset,many=True)
        return Response(serializer.data)

    def get_serializer_class(self):
        if self.action=='names':
            return ProjectsSerializer1
        else:
            return super().get_serializer_class()

方法3:有过滤、排序、分页功能

    @action(methods=['GET'],detail=False)
    def names(self,request):
        return super().list(request)

    def get_serializer_class(self):
        if self.action=='names':
            return ProjectsSerializer1
        else:
            return super().get_serializer_class()

重写paginate_queryset、filter_queryset方法,实现无分页和过滤功能

    @action(methods=['GET'],detail=False)
    def names(self,request):
        return super().list(request)


    def get_serializer_class(self):
        if self.action=='names':
            return ProjectsSerializer1
        else:
            return super().get_serializer_class()


    def paginate_queryset(self, queryset):
        if self.action=='names':
            return
        else:
            return super().paginate_queryset(queryset)

    def filter_queryset(self, queryset):
        if self.action=='names':
            return self.queryset
        else:
            return super().filter_queryset(queryset)

需求2:当访问项目的列表数据时:获取所有的字段;当访问项目的详情数据时:只展示项目名称和项目负责人;

方法1

    @action(methods=['GET'],detail=True)
    def names1(self,request,pk):
        object=self.get_object()
        serializer=self.get_serializer(instance=object)
        return Response(serializer.data)

    def get_serializer_class(self):
        if self.action=='names1':
            return ProjectsSerializer1
        else:
            return super().get_serializer_class()

方法2

    @action(methods=['GET'], detail=True)
    def names1(self, request, pk):
        return super().retrieve(request)

    def get_serializer_class(self):
        if self.action=='names1':
            return ProjectsSerializer1
        else:
            return super().get_serializer_class()

需求3:当访问项目的列表数据时:获取所有的字段;现在访问项目的列表数据时:只展示项目名称和项目负责人,展示项目名称包括京东

    @action(methods=['GET'],detail=False)
    def names(self,request):
        return super().list(request)

    def get_serializer_class(self):
       if self.action=='names':
           return ProjectsSerializer1
       if self.action=='names1':
           return ProjectsSerializer1
       else:
           return super().get_serializer_class()
           
    def get_queryset(self):
	   if self.action=='names':
	       return self.queryset.filter(name__contains='京东')
	   else:
	       return super().get_queryset()

todo 如何定义类视图?类视图的设计原则?
a、类视图尽量要简化
b、根据需求选择相应的父类视图
c、如果drf中的类视图有提供相应的逻辑,那么直接使用父类提供的
d、如果drf中的类视图,绝大多数逻辑都能满足需求,可以重写父类实现
e、如果drf中的类视图完全不满足要求,那么就直接自定义即可

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74049.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!