相关文章:
Django实现接口自动化平台(八)测试报告reports序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客
本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看:
python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台_做测试的喵酱的博客-CSDN博客
一、项目环境的应用场景
1.1 环境说明:
1、项目运行时,可以选择一套环境来运行
2、环境里,主要就是这个项目的host
1.2 环境的接口及应用场景
接口列表
请求方式 | URI | 对应action | 实现功能 |
GET | /envs/ | .list() | 查询env列表 |
POST | /envs/ | .create() | 创建一条数据 |
GET | /envs/{id}/ | .retrieve() | 检索一条env的详细数据 |
PUT | /envs/{id}/ | update() | 更新一条数据中的全部字段 |
PATCH | /envs/{id}/ | .partial_update() | 更新一条数据中的部分字段 |
DELETE | /envs/{id}/ | .destroy() | 删除一条数据 |
GET | /envs/names/ | .names() 自定义 | 查询env列表 |
1、查询env列表 .list()
GET | /envs/ | .list() | 查询env列表 |
注意:
1、列表涉及到分页
2、创建一条env .create()
3、查看详情与编辑 .retrieve() update() .partial_update()
- 查看 .retrieve()
- 更新 update() partial_update()
4、env列表 names
已经有list,为什么还要自定义action names:
- list 有分页,names没有分页
- list展示的项目数据,names只展示id 与 name
二、数据模型 model
models.py
from django.db import modelsfrom utils.base_models import BaseModelclass Envs(BaseModel):id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')name = models.CharField(verbose_name='环境名称', max_length=200, unique=True, help_text='环境名称')base_url = models.URLField(verbose_name='请求base url', max_length=200, help_text='请求base url')desc = models.CharField(verbose_name='简要描述', max_length=200, help_text='简要描述')class Meta:db_table = 'tb_envs'verbose_name = '环境信息'verbose_name_plural = verbose_nameordering = ('id',)def __str__(self):return self.name
环境模块,目前只有一个字段,就是
base_url = models.URLField(verbose_name='请求base url', max_length=200, help_text='请求base url')
整个项目的host地址
三、序列化器 serializers
serializers.py
from rest_framework import serializersfrom .models import Envsclass EnvsModelSerializer(serializers.ModelSerializer):class Meta:model = Envsexclude = ('update_datetime',)extra_kwargs = {'create_datetime': {'read_only': True,'format': '%Y年%m月%d日 %H:%M:%S'}}class EnvsNamesSerializer(serializers.ModelSerializer):class Meta:model = Envsfields = ('id', 'name')
有两个序列化器。
- EnvsModelSerializer:正常显示所有数据
- EnvsNamesSerializer:只显示id与name,为names action 准备的
四、视图
4.1 viewsets.ModelViewSet
views.py 视图
from rest_framework import viewsets
from rest_framework import permissions
from .models import Envs
from . import serializers
from utils.mixins import NamesMixinclass EnvsViewSet(NamesMixin, viewsets.ModelViewSet):queryset = Envs.objects.all()serializer_class = serializers.EnvsModelSerializerpermission_classes = [permissions.IsAuthenticated]def get_serializer_class(self):if self.action == "names":return serializers.EnvsNamesSerializerelse:return self.serializer_class
通过继承 viewsets.ModelViewSet视图类,实现以下接口
请求方式 | URI | 对应action | 实现功能 |
GET | /envs/ | .list() | 查询env列表 |
POST | /envs/ | .create() | 创建一条数据 |
GET | /envs/{id}/ | .retrieve() | 检索一条env的详细数据 |
PUT | /envs/{id}/ | update() | 更新一条数据中的全部字段 |
PATCH | /envs/{id}/ | .partial_update() | 更新一条数据中的部分字段 |
DELETE | /envs/{id}/ | .destroy() | 删除一条数据 |
重写了get_serializer_class 方法
EnvsViewSet(NamesMixin, viewsets.ModelViewSet)-> ModelViewSet->GenericViewSet->GenericAPIView 类下的方法。
get_serializer_class 源码:
重写后,当action为names时,返回序列化器为serializers.EnvsNamesSerializer
4.2 自定义names
相关知识点:
深入理解DRF中的Mixin类_做测试的喵酱的博客-CSDN博客
python中Mixin类的使用_做测试的喵酱的博客-CSDN博客
names接口,需要我们自定义action
GET | /envs/names/ | .names() 自定义 | 查询env列表 |
1、自定义 NamesMixin:
class NamesMixin:@action(methods=['GET'], detail=False)def names(self, request, *args, **kwargs):response = super().list(request, *args, **kwargs)return responsedef paginate_queryset(self, queryset):"""names action禁用分页功能:param queryset::return:"""if self.action == "names":returnelse:return super().paginate_queryset(queryset)def filter_queryset(self, queryset):"""names action禁用过滤功能:param queryset::return:"""if self.action == "names":return self.querysetelse:return super().filter_queryset(queryset)
2、自定义names action
@action(methods=['GET'], detail=False)def names(self, request, *args, **kwargs):response = super().list(request, *args, **kwargs)return response
3、分页处理
def filter_queryset(self, queryset):"""names action禁用过滤功能:param queryset::return:"""if self.action == "names":return self.querysetelse:return super().filter_queryset(queryset)
4、过滤处理
def filter_queryset(self, queryset):"""names action禁用过滤功能:param queryset::return:"""if self.action == "names":return self.querysetelse:return super().filter_queryset(queryset)
源码:
当action 为names时,不做分页、过滤功能的处理。
这里的 def paginate_queryset(self, queryset):
def filter_queryset(self, queryset): 方法,是重写。
重写的
EnvsViewSet(NamesMixin, viewsets.ModelViewSet)-> ModelViewSet->GenericViewSet->GenericAPIView 类下的方法。
GenericAPIView源码: