测试平台——项目模块模型类设计

这里写目录标题

  • 一、项目应用
    • 1、项目包含接口:
    • 2、创建子应用
    • 3、项目模块设计
      • a、模型类设计
      • b、序列化器类设计
      • c、视图类设计
    • 4、接口模块设计
      • a、模型类设计
      • b、序列化器类设计
      • c、视图类设计
    • 5、环境模块设计
    • 6、DRF中的通用过滤
      • 6.1、设置过滤器后端

一、项目应用

1、项目包含接口:

  • 项目管理接口
  • 接口管理接口
  • 环境管理接口

2、创建子应用

python manage.py startapp projects

3、项目模块设计

a、模型类设计

from django.db import models# Create your models here.
class Project(models.Model):"""项目表"""name = models.CharField(max_length=50, help_text='项目名称', verbose_name='项目名')leader = models.CharField(max_length=50, help_text='负责人', verbose_name='负责人', default='')create_time = models.DateTimeField(verbose_name='创建时间', help_text='创建时间', auto_now_add=True)class Meta:db_table = 'tb_project'verbose_name = '项目表'verbose_name_plural = verbose_namedef _str__(self):return self.name

b、序列化器类设计

from rest_framework import serializers
from rest_framework.serializers import ModelSerializerclass ProjectSerializer(ModelSerializer):class Meta:model = Projectfields = ['id', 'name', 'leader', 'create_time']

c、视图类设计

class ProjectViewSet(ModelViewSet):queryset = Project.objects.all()serializer_class = ProjectSerializer

获取项目的详情数据
需要展示字段:执行环境、执行场景、测试计划、接口数量、定时任务、执行记录

在这里插入图片描述
方法一:需要重写retrieve方法

class ProjectViewSet(ModelViewSet):queryset = Project.objects.all()serializer_class = ProjectSerializer# permission_classes = [IsAuthenticated]def retrieve(self, request, *args, **kwargs):response = super().retrieve(self, request, *args, **kwargs)obj = self.get_object()response.data['info'] = [{'name': '执行环境', 'value': TestEnv.objects.filter(project_id=obj.id).count()},{'name': '执行场景', 'value': TestScene.objects.filter(project_id=obj.id).count()},{'name': '测试计划', 'value': TestPlan.objects.filter(project_id=obj.id).count()},{'name': '接口数量', 'value': Interface.objects.filter(project_id=obj.id).count()},{'name': '定时任务', 'value': 0},  # todo 定时任务未开发{'name': '执行记录', 'value': Record.objects.filter(plan__project=obj).count()}]return response

方法二:模型类中定义新的字段(重点)

模型类

class Project(models.Model):"""项目表"""name = models.CharField(max_length=50, unique=True, help_text='项目名称', verbose_name='项目名')leader = models.CharField(max_length=50, help_text='负责人', verbose_name='负责人', default='')create_time = models.DateTimeField(verbose_name='创建时间', help_text='创建时间', auto_now_add=True)class Meta:db_table = 'tb_project'verbose_name = '项目表'verbose_name_plural = verbose_namedef _str__(self):return self.namedef info(self):return [{'name': '执行环境', 'value': self.test_envs.count()},{'name': '执行场景', 'value': self.test_scenes.count()},{'name': '测试计划', 'value': self.test_plans.count()},{'name': '接口数量', 'value': self.interfaces.count()},{'name': '定时任务', 'value': 0},       #todo 定时任务未开发{'name': '执行记录', 'value': Record.objects.filter(plan__project=self).count()}]

序列化器设计

class ProjectSerializer(ModelSerializer):class Meta:model = Projectfields = ['id', 'name', 'leader', 'create_time', 'info', 'bugs']

视图设计

class ProjectViewSet(ModelViewSet):queryset = Project.objects.all()serializer_class = ProjectSerializer

4、接口模块设计

a、模型类设计

class Interface(models.Model):"""接口表"""CHOICES = [('1', '项目接口'),('2', '外部接口')]project = models.ForeignKey('Project',on_delete=models.CASCADE,help_text='项目id',verbose_name='项目id',related_name='interfaces')name = models.CharField(max_length=50, help_text='接口名称', verbose_name='接口名称')url = models.CharField(max_length=200, help_text='接口路径', verbose_name='接口路径')method = models.CharField(max_length=50, help_text='请求方法', verbose_name='请求方法')type = models.CharField(verbose_name='接口类型',help_text='接口类型',max_length=40,choices=CHOICES,default='1')# 扩展,接口的说明,接口字段的参数def __str__(self):return self.urlclass Meta:db_table = 'tb_interface'verbose_name = '接口表'verbose_name_plural = verbose_name

b、序列化器类设计

class NestTestStepSerializer(ModelSerializer):"""嵌套测试步骤序列化器"""class Meta:model = TestStepfields = ['id', 'title']class InterfaceSerializer(ModelSerializer):steps = NestTestStepSerializer(many=True, read_only=True, source='teststep_set')class Meta:model = Interfacefields = '__all__'def validate(self, attrs):url = attrs.get('url')type_ = attrs.get('type')if type_ == '2':if not url.startswith('http'):raise serializers.ValidationError('外部接口的url需要完整的url,必须以http或者https开头')return attrs

获取接口的列表信息时:还需要将接口的下用例信息获取出来

c、视图类设计

5、环境模块设计

class TestEnv(models.Model):"""测试坏境表"""name = models.CharField(max_length=150, help_text='环境名称', verbose_name='环境名称')project = models.ForeignKey(Project,on_delete=models.CASCADE,help_text='项目id',verbose_name='项目id')global_variable = models.JSONField(help_text='全局变量',verbose_name='全局变量',default=dict,null=True)debug_global_variable = models.JSONField(help_text='debug模式全局变量',verbose_name="debug模式全局变量",default=dict,null=True)db = models.JSONField(help_text='数据库配置',verbose_name='数据库配置',default=list,null=True,blank=True)host = models.CharField(help_text='base_url地址',verbose_name='base_url地址',max_length=100,null=True,blank=True)headers = models.JSONField(help_text='请求头',verbose_name='请求头',default=dict,null=True, blank=True)global_func = models.TextField(help_text='全局工具函数',verbose_name='全局工具函数',default=open('./utils/global_func.py', 'r',encoding='utf-8').read(),null=True,blank=True)def __str__(self):return self.nameclass Meta:db_table = 'tb_testenv'verbose_name = '接口表'verbose_name_plural = verbose_name

6、DRF中的通用过滤

除了能够覆盖默认查询集之外,REST 框架还包括对通用过滤后端的支持,允许您轻松构建复杂的搜索和过滤器。

6.1、设置过滤器后端

可以使用设置全局设置默认过滤器后端DEFAULT_FILTER_BACKENDS。例如。

a、要使用DjangoFilterBackend,请先安装django-filter

pip install django-filter

注意djoango-filter仅支持:
● Python: 3.6,3.7,3.8
● Django: 2.2, 3.1,3.2
● DRF: 3.10+

b、注册

INSTALLED_APPS = [...'django_filters',...
]

c、配置

REST_FRAMEWORK = {......# 过滤'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
}

d、使用
在后端类视图或者视图集中添加filterset_fields属性即可实现指定字段过滤,例如改写环境管理视图集
如下:

class EnvViewSet(ModelViewSet):queryset = TestEnv.objects.all()serializer_class = EnvSerializerfilterset_fields = ['name','project']

不需要在复写get_queryset方法手动过滤,就可以通过url/test_envs/?project=1访问过滤数据了。
注意:当使用外键字段过滤时,如果级联模式是删除,则使用不存在的数据过滤会返回400响应。例如上面的
视图如果使用不存在的项目id过滤返回结果如下:

http://127.0.0.1:8000/test_envs?project=2

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/53809.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序环境和预处理(含C语言程序的编译+链接)--1

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🐻‍❄个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN…

Palo Alto Networks® PA-220R 下一代防火墙 确保恶劣工况下的网络安全

一、主要安全功能 1、每时每刻在各端口对全部应用进行分类 • 将 App-ID 用于工业协议和应用,例如 Modbus、 DNP3、IEC 60870-5-104、Siemens S7、OSIsoft PI 等。 • 不论采用何种端口、SSL/SSH 加密或者其他规避技术,都会识别应用。 • 使用…

树的层次遍历

层次遍历简介 广度优先在面试里出现的频率非常高,整体属于简单题。而广度优先遍历又叫做层次遍历,基本过程如下: 层次遍历就是从根节点开始,先访问根节点下面一层全部元素,再访问之后的层次,类似金字塔一样…

Python 开发工具 Pycharm —— 使用技巧Lv.3

单步执行调试 1: 鼠标左键单击红点是断点行 2:甲虫样式是进行调试方式运行,鼠标左键单击点击 3: 单步运行图标,点击让程序运行一行 4: 步入步出,可以进入当前代码行函数内 5:重新运行…

C语言笔试训练【第三天】

大家好,我是纪宁。 今天是C语言笔试训练的第三天,大家加油! 第一题 1、已知函数的原型是: int fun(char b[10], int *a) ,设定义: char c[10];int d; ,正确的调用语句是( &#xf…

Java分布式微服务1——注册中心(Eureka/Nacos)

文章目录 基础知识注册中心Eureka注册中心与Ribbon负载均衡1、Eureka注册中心2、Eureka的搭建3、Eureka服务注册4、复制服务实例5、拉取服务6、Ribbon负载均衡的流程及Eureka规则调整:7、Ribbon负载均衡饥饿加载 Nacos注册中心1、服务端Nacos安装与启动2、客户端Nac…

iOS 搭建组件化私有库

一、创建私有库索引 步骤1是在没有索引库的情况下或者是新增索引的时候才需要用到(创建基础组件库) 首先在码云上建立一个私有库索引,起名为SYComponentSpec 二、本地添加私有库索引 添加私有库索引 pod repo add SYComponentSpec https:/…

Vol的学习

nen 首先学习基础用法 1.查看系统基本信息 imageinfo vol.py -f 路径 imageinfo 2.查看进程命令行 cmdline cmdline vol.py -f 路径 --profile系统版本 cmdline vol.py -f 路径 --profile版本 cmdscan 3.查看进程信息 pslist vol.py -f 路径 --profile系统 pslist 通过…

maven开发利器:idea安装maven依赖分析插件 Maven Helper,谁用谁知道!

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 这篇博客给大家介绍一款博主实战开发中一直在使用的pom开发分析利器,教大家玩转maven:使用idea安装 Maven Helper 插件,可以分析依…

Dubbo+Zookeeper使用

说明:Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。 本文介绍Dubbo的简单使用及一些Dubbo功能特性,注册中心使用的是ZooKeeper,可在…

Mybatis 实体类属性名和表中字段名不一致怎么处理

一. 前言 最近耀哥有学生出去面试,被问到 “Mybatis实体类的属性名和表中的字段名不一致该怎么处理?”,这其实是一个很经典的面试题,接下来耀哥就为大家详细解析一下这道面试题。 二. 分析 2.1 实体类和字段名不一致所带来的后果…

在 aosp 中启用 Material You design

作者:Mr_万能胶 近期研究了一下如何在 aosp 中启用 Material You design,在把踩过的坑记录一下,方便后续有厂商可以快速集成。 本文基于 aosp 最新代码,版本号为 Android 13,并使用 Cuttlefish 快速验证。 Material …