Django模型继承之Meta继承

news2024/10/7 16:21:28

在Django模型继承中,当一个抽象基类被设计完成后,它会将该基类中定义的Meta内部类以属性的形式提供给子类。另外,如果子类未定义自己的Meta类,那么它就会默认继承抽象基类的Meta类。

关于Meta类的继承,大致总结如下:

  • 抽象基类中有的元数据属性,如果子模型没有,则子模型直接继承。
  • 抽象基类中有的元数据属性,如果子模型也有,则子模型直接覆盖。
  • 子模型可以额外添加元数据属性。
  • 抽象基类中的abstract=True属性不会被子类继承。
  • 有一些元数据属性(如db_table)对抽象基类是无效的。

首先,子类如果要设置自己的Meta属性,则必须扩展抽象基类的Meta类。示例代码如下:

【代码3-16】

01  from django.db import models
02  
03  class CommonInfo(models.Model):
04      # ...
05      class Meta:
06          abstract = True
07          ordering = ['name']
08  
09  class StudentInfo(CommonInfo):
10      # ...
11      class Meta(CommonInfo.Meta):   # 注意这里有个继承关系
12          db_table = 'student_info'
13      #...
14      pass

【代码分析】

在第03~07行代码中,定义了一个描述通用信息的抽象基类CommonInfo,具体内容说明如下:

  • 在第05~07行代码中,在Meta类中添加了属性“abstract=True”,表明CommonInfo类为抽象基类。

在第09~14行代码中,定义了一个关于学生信息的子类StudentInfo,具体内容说明如下:

  • 在第11行代码中,定义了自己的Meta类子类,并继承自基类的Meta类CommonInfo.Meta。
  • 在第12行代码中,定义了一个字段属性db_table。注意,该属性就是子类StudentInfo所扩展的属于自己的Meta属性。

如前文所述,元数据属性db_table对抽象基类无效。首先,对于抽象基类本身而言,是不会创建数据表的;其次,所有子类也不会按照这个元数据属性来设置表名。

另外,如果想让一个抽象基类的子类也同样成为一个抽象基类,则必须显式地在该子类的Meta类中同样声明一个“abstract=True”属性。示例代码如下:

【代码3-17】

01  from django.db import models
02  
03  class CommonInfo(models.Model):
04      # ...
05      class Meta:
06          abstract = True
07          ordering = ['name']
08  
09  class UserInfo(CommonInfo):
10      # ...
11      class Meta(CommonInfo.Meta):   	# 注意这里有个继承关系
12          abstract = True
13          ordering = ['username']
14  
15  class StudentInfo(UserInfo):
16      # ...
17      class Meta(UserInfo.Meta):   		# 注意这里有个继承关系
18          db_table = 'student_info'
19      #...
20      pass

【代码分析】

在第03~07行代码中,定义了一个描述通用信息的抽象基类CommonInfo,具体内容说明     如下:

  • 在第05~07行代码中,在Meta类中添加了属性“abstract=True”,表明CommonInfo类为抽象基类。
  • 在第09~13行代码中,定义了一个继承自抽象基类CommonInfo的用户信息子类UserInfo,具体内容说明如下:
  1. 在第11行代码中,定义了自己的Meta类子类,并继承自基类的Meta类CommonInfo.Meta。
  2. 在第12行代码中,在Meta类中添加了属性“abstract=True”,表明子类UserInfo仍为抽象基类。

在第15~20行代码中,定义了一个继承自抽象基类UserInfo的学生信息子类StudentInfo,具体内容说明如下:

  • 在第17行代码中,定义了自己的Meta类子类,并继承自基类的Meta类UserInfo.Meta。
  • 在第18行代码中,定义了一个字段属性db_table。注意,该属性就是子类StudentInfo所扩展的属于自己的Meta属性。

最后,基于Python语法继承的工作机制,如果子类继承了多个抽象基类,则默认情况下仅继承第一个列出基类的Meta选项。如果要从多个抽象基类中继承Meta选项,则必须显式地声明Meta继承。示例代码如下:

【代码3-18】

01  from django.db import models
02  
03  class CommonInfo(models.Model):
04      name = models.CharField(max_length=100)
05      age = models.PositiveIntegerField()
06  
07      class Meta:
08          abstract = True
09          ordering = ['name']
10  
11  class Unmanaged(models.Model):
12      class Meta:
13          abstract = True
14          managed = False
15  
16  class StudentInfo(CommonInfo, Unmanaged):
17      home_group = models.CharField(max_length=5)
18  
19      class Meta(CommonInfo.Meta, Unmanaged.Meta):
20          pass
21      #...
22      pass

【代码分析】

在第03~09行代码中,定义了第一个描述通用信息的抽象基类CommonInfo,具体内容说明如下:

  • 在第07~09行代码中,在Meta类中添加了属性“abstract=True”,表明CommonInfo类为抽象基类。

在第11~14行代码中,定义了第二个抽象基类Unmanaged。在第12~14行代码中,在Meta类中添加了属性“abstract=True”,表明Unmanaged类为抽象基类。

在第16~20行代码中,定义了一个同时继承自抽象基类CommonInfo和Unmanaged的学生信息子类StudentInfo,具体内容说明如下:

  • 在第19行代码中,定义了自己的Meta类子类,并继承自基类的Meta类CommonInfo.Meta和Unmanaged.Meta,该定义方式就是显式地声明Meta类继承。

本文节选自《Django 5企业级Web应用开发实战(视频教学版)》,获出版社和作者授权发布。

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

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

相关文章

Ubuntu20.04安装redis5.0.7

redis下载命令: wget https://download.redis.io/releases/redis-5.0.7.tar.gz 解压到 opt目录下 tar -zxvf redis-5.0.7.tar.gz -C /opt apt install -y gcc # 安装gccapt install make # 安装make 后面执行make一直报错 make报错后清除: make …

机器学习(XgBoost)预测顶和底

之前的文章中,我们对中证1000指数进行了顶和底的标注。这一篇我们将利用这份标注数据,实现机器学习预测顶和底,并探讨一些机器学习的原理。 我们选取的特征非常简单–上影线和WR(William’s R)的一个变种。选取这两个…

环境配置——Windows平台配置VScode运行环境为远程服务器或虚拟机

1. 远程机需要先安装SSH服务,命令如下 sudo apt install openssh-server 2. 安装好后需要开启SSH服务: sudo service sshd start 3. 查看SSH服务是否有被开启: sudo systemctl status sshd.service 4. 本地Windows需要生成密钥将公钥放…

毕业撒花 流感服务小程序的设计与实现

目录 1.1 总体页面设计 1.1.1 用户首页 1.1.2 新闻页面 1.1.3 我的页面 1.1.5 管理员登陆页面 1.1.6 管理员首页 1.2 用户模块 1.2.1 体检预约功能 1.2.2 体检报告功能 1.2.4 流感数据可视化功能 1.2.5 知识科普功能 1.2.6 疾病判断功能 1.2.7 出示个人就诊码功能 …

(五)AB测试及两个案例 学习简要笔记 #统计学 #CDA学习打卡

目录 一. AB测试简介 1)假设检验的一般步骤 2)基于假设检验的AB测试步骤 二. 案例1:使用基于均值的假设检验进行AB测试 1)原始数据 2)提出原假设H0和备择假设H1 3)使用均值之差的t检验,计…

计算机网络3——数据链路层3以太网的MAC层

文章目录 一、MAC 层的硬件地址1、介绍2、注意点3、定制标准 二、MAC 帧的格式1、结构2、工作原理3、其他 一、MAC 层的硬件地址 1、介绍 在局域网中,硬件地址又称为物理地址或 MAC地址(因为这种地址用在MAC帧中)。 大家知道,在所有计算机系统的设计中…

MySQL从入门到高级 --- 2.DDL基本操作

文章目录 第二章:2.基本操作 - DDL2.1 数据库的常用操作创建数据库选择要操作的数据库删除数据库修改数据库编码 2.2 表结构的常用操作创建表格式查看当前数据库的所有表名称查看指定某个表的创建语句查看表结构删除表 2.3 修改表结构添加列修改列名和类型删除列修改…

在Spring boot中指定随机可用的端口

​ 正常情况下每个spring boot启动都有固定的端口,也就是8080,如果启动多个项目,很容易出现端口冲突,那么怎么解决这个问题呢? 解决方案1: random 随机端口 ​ 在spring boot中,可以通过${ran…

20240424 每日一题:2385. 感染二叉树需要的总时间

题目简介: 这个问题描述了一个情景:给定一棵二叉树和一个起始节点值,起始节点被感染后,感染将从该节点开始向其相邻节点传播。每分钟,如果一个节点此前还没有感染,并且它与一个已感染节点相邻,…

vue项目打包时因为图片问题报错

执行 npm run build命令打包项目时报错,看起来是图片的问题: package.json里面image-webpack-loader的版本是^7.0.1 解决方案: 1、先卸载 npm uninstall image-webpack-loader 2、用cnpm重新安装 cnpm install image-webpack-loader --save…

《ElementPlus 与 ElementUI 差异集合》el-select 差异点,如:高、宽、body插入等

宽度 Element UI 父元素不限制宽度时,默认有个宽度 207px; 父元素有固定宽度时,以父元素宽度为准; Element Plus 父元素不限制宽度时,默认100%; 父元素有固定宽度时,以父元素宽度为准&#x…

百度网盘SVIP超级会员试用1天领取活动地址2024最新

百度网盘SVIP超级会员是百度网盘提供的一种高级会员服务,用户开通后可以享受多项特权和服务。以下是对百度网盘SVIP超级会员的详细介绍: 一、会员特权 百度网盘SVIP超级会员享有众多特权,包括但不限于: 容量套餐:SV…

Linux系统安全:从面临的攻击和风险到安全加固、安全维护策略(文末有福利)

1. Linux面临的攻击与风险 1.1. Linux系统架构 Linux系统架构解读: 用户之间隔离内核态与用户态之间隔离用户进程一般以低权限用户运行系统服务一般以特权服务运行用户态通过系统调用进入内核态内核对系统资源进行管理和分配 1.2. Linux系统常见安全威胁 1.2.1.…

uniapp项目中禁止横屏 ,app不要自动旋转 -,保持竖屏,uniapp取消重力感应

uniapp项目中禁止横屏 ,app不要自动旋转 -,保持竖屏,uniapp取消重力感应 1.适用于移动端,安卓和IOS,当即使手机打开了自动旋转的按钮,设置如下的代码后,页面依旧保持竖屏。 步骤一&#xff1a…

Git和Github绑定

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Linux - sed (stream editor) cp > bak备份 head

替换 my.yaml 的 ‘t’ 为 ‘AAA’ sed s/t/AAA/g my.yaml sed -n /^[as]/p my.yaml 这个命令的 -n 选项表示不自动打印每一行,/^[as]/p 是一个 sed 命令,/^[as]/ 是你想要匹配的正则表达式(所有以 a | s 开头的行&#x…

3D地图大屏 附源码(Three.js + Vue3)

目录 👋 前言 🚀 项目包 ⚒️ 字体制作 🌐 地图制作 💡 参考视频 & 项目 开源项目(Vue3tsWindcssEchartThree.js大屏案例) 开源(教程) UI风格学习( www.shuzixs.com …

C++ :string类模板的使用

目录 前言: 一、string类模板的介绍 二、string类模板的成员函数的使用 string的构造 string的赋值运算符重载 iterator迭代器 capacity Element Access(元素访问) Modifiers修改字符串 1.运算符重载 2.std::string::append …

全领域覆盖!美创入选IDC中国数据安全市场图谱

近日,全球领先的IT市场研究和咨询公司IDC发布首个《IDC Market Glance:中国数据安全市场图谱,2024》报告(以下简称“报告”),该报告遴选出不同细分市场领域的主要技术服务供应商,绘制出市场地图…

第四百七十五回

文章目录 1. 概念介绍2. 功能与用法2.1 主要功能2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"四个bublue包对比与总结"相关的内容,本章回中将介绍Get包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中将介…