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

这里写目录标题

  • 一、项目应用
    • 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.rhkb.cn/news/77401.html

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

相关文章

GEE:谐波模型在遥感影像中的应用(季节性变化的拟合与可视化)

作者:CSDN @ _养乐多_ 谐波模型是一种常用的工具,用于拟合和分析影像数据中的周期性和季节性变化。本文将介绍如何使用Google Earth Engine平台实现谐波模型,通过对Landsat影像进行处理和拟合,展示季节性变化的拟合结果,并通过图表和地图可视化展示数据。 谐波模型是一种…

LabVIEW开发多材料摩擦电测量控制系统

LabVIEW开发多材料摩擦电测量控制系统 摩擦电效应是两个物体摩擦在一起,电荷从一个物体转移到另一个物体的现象,从而导致两个物体携带相等和相反的电荷。接触和充电是主导该过程的两个关键因素。当静电荷累积到一定水平时,可能会出现放电现象…

一起学算法(选择排序篇)

距离上次更新已经很久了,以前都是非常认真的写笔记进行知识分享,但是带来的情况并不是很好,一度认为发博客是没有意义的,但是这几天想了很多,已经失去了当时写博客的初心了,但是我觉得应该做点有意义的事&a…

sql 参数自动替换

需求&#xff1a;看日志时&#xff0c;有的sql 非常的长&#xff0c;参数比较多&#xff0c;无法直接在sql 客户端工具执行&#xff0c;如果一个一个的把问号占位符替换为参数太麻烦&#xff0c;因此写个html 小工具&#xff0c;批量替换&#xff1a; 代码&#xff1a; <!…

【项目 线程4】3.12生产者消费者模型 3.13条件变量 3.14信号量 C++实现生产者消费者模型

3.12生产者消费者模型 生产者消费者模型中的对象&#xff1a; 1、生产者 2、消费者 3、容器 若容器已满&#xff0c;生产者阻塞在这&#xff0c;通知消费者去消费&#xff1b;若容器已空&#xff0c;则消费者阻塞&#xff0c;通知生产者去生产。生产者可以有多个&#xff0c;消…

HTML5中的data-*属性

介绍&#xff1a; data-*全局属性是一类被称为自定义数据属性的属性&#xff0c;它赋予我们在所有 HTML 元素上嵌入自定义数据属性的能力。 data-*的使用 <div class"child" data-name"小红" data-age"18"></div> 在js里有两种获…

JavaEE——网络初识 (简单介绍两种协议以及网络通信的基础概念)

文章目录 一、简单了解网络发展二、网络通信基础认识三、利用UDP举例解释网络信息传输 一、简单了解网络发展 总的来讲&#xff0c;网络的发展史就是&#xff0c;先是一小部分的计算机之间连接通信&#xff0c;随着技术发展&#xff0c;逐渐扩大范围&#xff0c;形成了我们当前…

【unity】Pico VR 开发笔记(视角移动)

【unity】Pico VR 开发笔记&#xff08;视角移动&#xff09; 视角移动是简单的基础功能&#xff0c;这里区别于头显定位获得的小范围位移&#xff0c;是长距离不影响安全边界的位移方式。的常见的位移方式有两种&#xff0c;其一是触发后瞬间传送到指定位置&#xff0c;其次是…

TBB库中实现协程(coroutine)的源码说明

源码请见: https://github.com/oneapi-src/oneTBB/blob/master/src/tbb/co_context.h 在windows系统&#xff0c;TBB(也就是intel 的 oneTBB库)&#xff0c;通过windwos fiber(纤程)来实现协程(coroutine)。 创建一个协程,代码很简洁: inline void create_coroutine(corouti…

图论-简明导读

计算机图论是计算机科学中的一个重要分支&#xff0c;它主要研究图的性质和结构&#xff0c;以及如何在计算机上有效地存储、处理和操作这些图。本文将总结计算机图论的核心知识点。 一、基本概念 计算机图论中的基本概念包括图、节点、边等。图是由节点和边构成的数据结构&am…

前端技术搭建五子棋游戏(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了拼图游戏&#xff0c;今天还是继续按照我们原定的节奏来带领大家完成一个五子棋游戏&#xff0c;功能也比较简单简单&#xff0c;也…

MCUXpresso for VS Code -- 基于VSCode开发RT1176

MCUXpresso for VS Code 是nxp推出插件&#xff0c;旗下MCX LPC, Kinetis和i.MX rt等MCU&#xff0c;都能在VS Code平台进行嵌入式开发。功能框图如下&#xff1a; 前期准备&#xff1a; 软件环境: windows(实际可以跨系统&#xff0c;linux和mac没有测试) VS Code ninja CMa…

elementui Cascader 级联选择使用心得

相信大家对于elementui并不陌生&#xff0c;作为适配Vue的优秀UI框架之一&#xff0c;一直被所有的开发者痛并快乐着。今天要记录的就是里边的主角之一Cascader。 首先先介绍一下Cascader ---> 当一个数据集合有清晰的层级结构时&#xff0c;可通过级联选择器逐级查看并选择…

树莓派安装ubuntu

ubuntu包下载 从ubuntu 官网下载镜像&#xff1a;https://cn.ubuntu.com/blog/build-raspberry-pi-desktop-ubuntu 按个人需求下载&#xff0c;可以首先使用 桌面版22.04 LTS版本&#xff1b; 烧录 从树莓派管官网下载image烧录工具&#xff1a;https://www.raspberrypi.c…

任务15、MidJourney视频(Video)参数动态上线,制作惊艳动画短片

15.1 任务概述 本次任务将帮助你掌握Midjourney中的Video参数,并利用这些参数创作出令人惊艳的绘画作品。通过学习Video参数的基本概念和功能,以及案例的实际应用,你将学会如何正确设置和调整这些参数,从而达到你所期望的绘画效果。最终,你将运用所学知识,生成香奈儿模特…

ensp-单臂路由

ensp-单臂路由 日期&#xff1a;6-26 &#x1f4ce;单臂路由.zip&#x1f4ce;单臂路由.docx

web基础与tomcat环境部署

一. 简述静态网页和动态网页的区别。 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览器进行解析&#xff0c;显示的页面称为静态页面。处理文件类型如.html、jpg、.gif、.mp4、.swf、.avi、.wmv、.flv等 请求响应信息&#xff0c;发给事务端进行处理&#xff0…

MQTT协议详解「概念、特性、版本及作用」

MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输&#xff09;是ISO标准下基于发布/订阅方式的轻量级消息协议。MQTT通常使用TCP / IP&#xff08;传输控制协议/Internet协议&#xff09;作为其传输&#xff0c;但也可以使用其他双向传输。MQ…

【雕爷学编程】MicroPython动手做(33)——物联网之天气预报

天气&#xff08;自然现象&#xff09; 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象&#xff0c;即某瞬时内大气中各种气象要素&#xff08;如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等&#xff…

Linux软件安装

软件安装 安装软件的方式 软件的安装方式 二进制发布包安装: 软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可rpm安装:软件已经按照redhat的包管理规范进行打包&#xff0c;使用rpm命令进行安装&#xff0c;不能自行解决库依赖问题yum安装:一…