相关文章:
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 models
from utils.base_models import BaseModel
class 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_name
ordering = ('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 serializers
from .models import Envs
class EnvsModelSerializer(serializers.ModelSerializer):
class Meta:
model = Envs
exclude = ('update_datetime',)
extra_kwargs = {
'create_datetime': {
'read_only': True,
'format': '%Y年%m月%d日 %H:%M:%S'
}
}
class EnvsNamesSerializer(serializers.ModelSerializer):
class Meta:
model = Envs
fields = ('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 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
通过继承 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() | 删除一条数据 |
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 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)
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.queryset
else:
return super().filter_queryset(queryset)
4、过滤处理
def filter_queryset(self, queryset):
"""
names action禁用过滤功能
:param queryset:
:return:
"""
if self.action == "names":
return self.queryset
else:
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源码: