Django 模型的继承

news2024/10/7 12:25:59

Django 模型的继承

    • 项目管理
      • 模型关联关系
      • 模块的包管理
      • 模型的继承

项目管理

到目前为止,都是属于httprunner中的用例部分,针对核心功能进行的开发工作,要把平台做成一个用户可以使用的程度还需要些额外的功能,比如项目管理,用户管理等。

首先考虑需要增加的数据模型,项目管理需要项目,模块,和测试环境等相关数据,同时原有模型需要增加一些额外的通用字段,如增加时间,更新时间等。

模型关联关系

首先确立模型的关联关系

在这里插入图片描述

用例和项目之间的关联可以直接通过config,因为config是套件和用例的扩展,相当于用例和套件本身。

模块的包管理

在我们使用 python manage.py startapp xxx 命令创建新的应用时,Django会自动帮我们建立一个应用的基本文件组织结构,其中就包括一个 models.py 文件。通常,我们把当前应用的模型都编写在这个文件里,但是如果你的模型很多,那么将单独的 models.py 文件分割成一些独立的文件是个更好的做法。

首先,我们需要在应用中新建一个叫做 models 的包,包下自动创建了一个__init__.py文件,该文件是用于确立包的身份,建同名的目的是为了其他引用原model.py文件的模块中代码不需发生更改。

新增一个hr3.py文件,将 models.py 文件中的代码复制到hr3.py文件中,然后删除 models.py 文件

最后在 __init__.py 文件中导入所有的模型。

from .hr3 import Step,Case,Config,Request

要显式明确地导入每一个模型,而不要使用 from .models import * 的方式,这样不会混淆命名空间,让代码更可读,更容易被分析工具使用。

最终的模型结构

其中hr3.py存放所有核心数据模型,mgr.py 存放所有项目管理相关(项目和环境数据)模型

mgr.py

# 存放所有项目管理相关模型

from django.db import models

# 定义项目 类
class Project(models.Model):
    Pro_Status = (
        ('developing','开发中'),
        ('operating','维护中'),
        ('stable','稳定运行中'),
        )
    name = models.CharField(max_length=32,unique=True,verbose_name='项目名称')
    status = models.CharField(max_length=32,choices=Pro_Status,default='stable',verbose_name='项目状态')
    version = models.CharField(max_length=32,default='V1.0',verbose_name='版本')

    def __str__(self):
        return self.name    # 以 项目名称 对外展示

    # 模型元类
    class Meta:
        db_table = 'Project'  # 如果不设置,默认的名称是 app名_模型名
        ordering = ['id']  # 根据id排序(默认为顺序排序)
        verbose_name = '项目表'  # 表的对外显示名称


# 定义 测试环境 类
class Enviroment(models.Model):
    # 服务器类型选项
    service_type = (
        (0,'web服务器'),
        (1,'数据库服务器'),
        (2,'文件存储服务器'),
    )
    # 服务器操作系统类型选项
    service_os = (
        (0, 'Windows'),
        (1, 'CentOS'),
        (2, 'Ubuntu'),
        (3, 'Debian'),
    )
    # 服务器状态类型选项
    service_status = (
        (0, '未激活'),
        (1, '使用中'),
        (2, '已过期'),
    )
    project = models.ForeignKey(Project,on_delete=models.CASCADE,verbose_name='所属项目')
    # django-ORM框架提供 GenericIPAddressField 专门存储ip类型信息,对入参ip格式会有校验
    ip = models.GenericIPAddressField(default='127.0.0.1',verbose_name='IP地址')
    # PositiveSmallIntegerField 正整数类型
    port = models.PositiveSmallIntegerField(default=80,verbose_name='端口号')
    category = models.SmallIntegerField(choices=service_type,default=0,verbose_name='服务器类型')
    os = models.SmallIntegerField(choices=service_os,default=1,verbose_name='服务器操作系统')
    status = models.SmallIntegerField(choices=service_status,default=0,verbose_name='服务器状态')

    def __str__(self):
        return self.ip+self.port

    # 模型元类
    class Meta:
        db_table = 'Enviroment'  # 如果不设置,默认的名称是 app名_模型名
        ordering = ['id']  # 根据id排序(默认为顺序排序)
        verbose_name = '测试环境表'  # 表的对外显示名称

模型的继承

一般在实际项目中,数据模型除了业务字段以外,还需要有一些通用字段,如创建时间,更新时间,创建者,更新者等,这些字段如果在每个模型都定义的话,冗余度很高,而且维护起来不方便。

此时,我们可以用一个抽象模型类来存放这些字段,然后其他模型继承该抽象模型类即可。

models 包下创建了一个base.py文件,定义一个抽象模型 CommonInfo

# 公共模型

from django.db import models

class CommonInfo(models.Model):
    # 公共字段部分: 创建时间、更新时间、描述
    create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
    # auto_now_add 第一次创建数据时自动添加当前时间
    update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
    # auto_now 每次更新数据时自动添加当前时间
    desc = models.TextField(null=True,blank=True,verbose_name='描述')

    def __str__(self):
        # 判断当前数据对象是否有name属性,如果有,返回name,如果没有,返回描述
        if hasattr(self,'name'):    # hasattr 是Python中是反射的一种用法
            return self.name
        else:
            return self.desc


    class Meta:
        abstract =True  # 定义抽象表,不会创建数据库表
        ordering = ['id']  # 根据id排序(默认为顺序排序)

由于在元类中定义了abstract = True ,抽象模型在同步数据库的时候并不会创建表,子类只会继承其字段和方法

另外元类除了abstract = True不会继承,其他都会继承,若想把子类也设置为抽象模型,必须显示在元类中设置abstract = True

mgr.py 中的模型为例,子类继承抽象父类:

mgr.py

# 存放所有项目管理相关模型

from django.db import models
from .base import CommonInfo

# 定义项目 类
class Project(CommonInfo):
    Pro_Status = (
        ('developing','开发中'),
        ('operating','维护中'),
        ('stable','稳定运行中'),
        )
    name = models.CharField(max_length=32,unique=True,verbose_name='项目名称')
    status = models.CharField(max_length=32,choices=Pro_Status,default='stable',verbose_name='项目状态')
    version = models.CharField(max_length=32,default='V1.0',verbose_name='版本')

    # 模型元类
    class Meta(CommonInfo.Meta): # 元类也需要显示继承父类的元类才会生效
        db_table = 'Project'  # 如果不设置,默认的名称是 app名_模型名
        verbose_name = '项目表'  # 表的对外显示名称


# 定义 测试环境 类
class Enviroment(CommonInfo):
    # 服务器类型选项
    service_type = (
        (0,'web服务器'),
        (1,'数据库服务器'),
        (2,'文件存储服务器'),
    )
    # 服务器操作系统类型选项
    service_os = (
        (0, 'Windows'),
        (1, 'CentOS'),
        (2, 'Ubuntu'),
        (3, 'Debian'),
    )
    # 服务器状态类型选项
    service_status = (
        (0, '未激活'),
        (1, '使用中'),
        (2, '已过期'),
    )
    project = models.ForeignKey(Project,on_delete=models.CASCADE,verbose_name='所属项目')
    # django-ORM框架提供 GenericIPAddressField 专门存储ip类型信息,对入参ip格式会有校验
    ip = models.GenericIPAddressField(default='127.0.0.1',verbose_name='IP地址')
    # PositiveSmallIntegerField 正整数类型
    port = models.PositiveSmallIntegerField(default=80,verbose_name='端口号')
    category = models.SmallIntegerField(choices=service_type,default=0,verbose_name='服务器类型')
    os = models.SmallIntegerField(choices=service_os,default=1,verbose_name='服务器操作系统')
    status = models.SmallIntegerField(choices=service_status,default=0,verbose_name='服务器状态')

    def __str__(self):
        return self.ip+self.port

    # 模型元类
    class Meta(CommonInfo.Meta):
        db_table = 'Enviroment'  # 如果不设置,默认的名称是 app名_模型名
        ordering = ['-id']  # 根据id倒序排序
        verbose_name = '测试环境表'  # 表的对外显示名称

Project类和Enviroment类都需要继承CommonInfo抽象类,且元类Meta也需要继承CommonInfo中的Meta元类,但如果有相同的字段,会被覆盖,比如Enviroment类中排序ordering是根据 id 倒序排序

类似的,对hr3.py文件也可进行抽象类的继承

models 包下的 __init__.py 文件中导入所有的模型

from .hr3 import Step,Case,Config,Request
from .mgr import Enviroment,Project

将修改同步至数据库

python manage.py makemigrations
python manage.py migrate

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

13薪| 8k-14k Java开发工程师

"众推职聘”以交付结果为宗旨的全流程化招聘服务平台!今日招聘信息↓工作内容1.参与软件项目和产品概要设计,负责详细功能设计、编码实现及相关文档编写;2.根据模块设计完成相应的模块编码及单元测试;3.对用户行为、需求及反…

zeek集群简述

Zeek不是多线程的,因此,一旦达到单处理器内核的限制,当前唯一的选择就是将工作负载分散到多个内核,甚至多个物理计算机上。Zeek的集群部署场景是构建这些大型系统的当前解决方案。Zeek附带的工具和脚本提供了一种结构,…

自注意力和位置编码(比较卷积神经网络、循环神经网络和自注意力)

在自注意力中,查询、键和值都来自同一组输入。 卷积神经网络和自注意力都拥有并行计算的优势,而且自注意力的最大路径长度最短。但是因为其计算复杂度是关于序列长度的二次方,所以在很长的序列中计算会非常慢。 为了使用序列的顺序信息&…

Nostr with NIP-05 Verification Guide

What is a NIPNIPs (Nostr Implementation Possibilities) document what MUST, what SHOULD and what MAY be implemented by Nostr-compatible relay and client software. See a complete list of nips here.NIP-05 提案是针对用户 Nostr 帐户的验证方法,可以将其…

The update is not applicable to your computer

在安装windows CVE-2022-44698补丁的时候出现了报错,"Windows Update Standalone Installer The update is not applicable to your computer" 1.找到漏洞对应的官方文章 CVE-2022-44698 - Security Update Guide - Microsoft - Windows SmartScreen S…

学术科研无从下手?27 条机器学习避坑指南,让你的论文发表少走弯路

内容一览:如果你刚接触机器学习不久,并且未来希望在该领域开展学术研究,那么这份为你量身打造的「避坑指南」可千万不要错过了。 关键词:机器学习 科研规范 学术研究 机器学习学术小白,如何优雅避坑坑、让自己的论文顺…

力扣sql简单篇练习(九)

力扣sql简单篇练习(九) 1 合作过至少三次的演员和导演 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT actor_id,director_id FROM ActorDirector GROUP BY actor_id,director_id HAVING count(timestamp)>31.3 运行截图 2 患某种疾病的患…

结构体内存对齐;内存优化

结构体需要根据数据类型进行内存对齐。 所有数据类型占据空间的大小,一定是它基础类型的倍数。 首先按照最大的数据类型格式来作为最小分割单元。 最大整数倍 struct stu {char gender;unsigned int age; }student1;int main() {printf("sizeof this struct i…

SpringCloud Config分布式配置中心

目录 一、概述 二、Config服务端配置与测试 配置读取规则 三、Config客户端配置与测试 bootstrasp.yml 四、Config客户端之动态刷新 一、概述 官网:Spring Cloud Config 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对…

【Java】IDEA调试线上服务

目录IEDA打开线上服务对应的代码,Edit Configuration创建与远程服务的连接复制黄匡生成的参数,添加到服务器启动命令中服务器的服务重新启动,并注意调试端口5005是否被防火墙拦截本地IDEA启动,控制台打印如图即成功代码上加断点&a…

Linux做选择题时的要点

1.线程独有:栈,寄存器,信号屏蔽字,errno...等信息,因此各个线程各自有各自的栈区,但是堆区共用。 2.用户态线程的切换在用户态实现,不需要内核支持。 3.每个线程在进程虚拟地址空间中会分配拥…

部署在Docker中的iServer进行服务迁移

目录前言一:备份与恢复1.备份2.恢复二:迁移配置文件作者:kxj 前言 Linux 容器虚拟技术(LXC,Linux Container)是一种轻量级的虚拟化手段,它利用内核虚拟化技术提供轻量级的虚拟化,来…

【八大数据排序法】希尔排序法的图形理解和案例实现 | C++

第十七章 希尔排序法 目录 第十七章 希尔排序法 ●前言 ●认识排序 ●一、希尔排序法是什么? 1.简要介绍 2.图形理解 3.算法分析 ●二、案例实现 1.案例一 ●总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一…

C++引用(特性+使用场景+常引用)

文章目录1. 概念2. 关于别名的理解3. 引用的特性1.引用必须在定义时初始化2.一个变量可以有多个别名3.引用一旦引用一个实体,再不能引用其他实体4.使用场景1. 引用做参数2. 引用做返回值1. 传值返回是否为n直接返回临时变量作为返回值2. 传引用返回编译器傻瓜式判断…

11、循环语句

目录 一、while语句 二、do…while语句 三、for语句 一、while语句 使用while语句可以执行循环结构,其一般形式如下: while语句的执行流程图: while语句首先检验一个条件,也就是括号中的表达式。当条件为真时,就执…

跟同事杠上了,用雪花算法生成的id做主键对MySQL性能有影响?

公司最近开发了一个新项目,设计表时由于有些字段需要对外展示,所以使用了雪花算法生成的id做主键。 不过有位同事对此提出了异议,认为雪花算法生成的id不是顺序递增的,会对MySQL的性能造成影响。 经过交流,发现持有这…

【Linux 系统运维基础】Linux目录 以及重要配置文件

Linux目录 以及重要配置文件 文本讲述了Linux中目录含义 以及我们工作中常用到的路径 1. 目录含义 2. 常用路径地址 2.1 网卡配置文件 /etc/sysconfig/network-scripts但是网卡的名称是有区别的,使用不同服务器生产商的名称是不同的。如下图: 网卡配置…

Window10下FFMPEG的安装与使用

文章目录一.FFMPEG介绍FFMPEG组成二.Windows10下FFMPEG安装三.FFMPEG的使用1.关键指令一.FFMPEG介绍 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它…

字节前端面试题目2

1.为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片? 1. 没有跨域问题,一般这种上报数据,代码要写通用的;(排除 ajax) 2. 不会阻塞页面加载,影响用户的体验,只…

基于SSM的图书购物商城设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…