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

需求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中的类视图完全不满足要求,那么就直接自定义即可

猜你喜欢

转载自blog.csdn.net/YZL40514131/article/details/124829842
今日推荐