相关文章:
Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客
深入理解DRF中的Mixin类_做测试的喵酱的博客-CSDN博客
python中Mixin类的使用_做测试的喵酱的博客-CSDN博客
本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看:
python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台_做测试的喵酱的博客-CSDN博客
一、背景
学生信息(id,name,age,address)
查看数据列表(学生列表)时,需要两种展示形式。
形式一:直接展示学生详细信息的列表 .list()
形式二:只展示id与name学生信息的列表 .names()
形式一与形式二,对应的序列化器是不一样的。
所以自定义names() acntion ,来对应另一个序列化器
二、自定义action
# -*- coding: utf-8 -*-
import os
from datetime import datetime
from django.conf import settings
from rest_framework.decorators import action
from rest_framework.response import Response
from envs.models import Envs
from utils import common
class NamesMixin:
@action(methods=['GET'], detail=False)
def names(self, request, *args, **kwargs):
response = super().list(request, *args, **kwargs)
return response
def paginate_queryset(self, queryset):
"""
names action禁用分页功能
:param queryset:
:return:
"""
if self.action == "names":
return
else:
return super().paginate_queryset(queryset)
def filter_queryset(self, queryset):
"""
names action禁用过滤功能
:param queryset:
:return:
"""
if self.action == "names":
return self.queryset
else:
return super().filter_queryset(queryset)
1、自定义names action
2、当action 为names时:
当action 为names时,不做分页、过滤功能的处理。
这里的 def paginate_queryset(self, queryset):
def filter_queryset(self, queryset): 方法,是重写。
重写的
EnvsViewSet(NamesMixin, viewsets.ModelViewSet-> ModelViewSet->GenericViewSet->GenericAPIView 类下的方法。
GenericAPIView源码:
三、Mixin类应用
Mixin类需要配合其他类一起使用,视图类:
from rest_framework import viewsets
from rest_framework import permissions
from .models import Envs
from . import serializers
from utils.mixins import NamesMixin
class EnvsViewSet(NamesMixin, viewsets.ModelViewSet):
queryset = Envs.objects.all()
serializer_class = serializers.EnvsModelSerializer
permission_classes = [permissions.IsAuthenticated]
def get_serializer_class(self):
if self.action == "names":
return serializers.EnvsNamesSerializer
else:
return self.serializer_class
get_serializer_class 方法,也是重写的GenericAPIView(views.APIView) 类的方法。
一共重写了三个方法
- 分页功能:def paginate_queryset(self, queryset)
- 过滤功能:def filter_queryset(self, queryset)
- 选择序列化器:def get_serializer_class(self):
分页、过滤 在 自定义Mixin类,下重写,是为了方便封装,这是通用的
选择序列化器 在 具体应用的视图类下,重写,这个是个性化的,不同的视图类,需要指定不同的序列化器。