Django模型的继承

Django模型的继承

Django模型的继承,包括模型的抽象基类、Meta继承、related_name和related_query_name属性、多表继承、Meta和多表继承、继承与反向关系、代理模型、代理模型继承和未托管模型,以及多重继承等内容。本文讲解一下抽象基类继承,其他继承后续发布。

3.6.1  关于模型继承

Django模型的继承与普通类的继承基本一致,在Python语言中的工作方式也几乎完全相同,同时也要遵循Django官方文档中关于模型的3点描述(参看3.1.2节)。Django模型继承的基类需要继承自django.db.models.Model。

设计人员在使用模型继承时,只需要决定父类模型是否需要拥有数据表,或者父类模型是否仅作为承载子类中可见的公共信息的载体。

Django模型的继承有以下3种可用的集成风格:

  • 建议将父类设计为抽象基类来使用,仅用于作为子类的公共信息的载体,免去在每个子类中将这些代码都重复写一遍。
  • 假如要继承一个模型,并且想要每个模型都有对应的数据表,则建议使用多表继承方式。
  • 假如只想修改模型的Python级行为,而不是以任何形式修改模型字段,则建议使用代理模型方式。

3.6.2  抽象基类

在Django模型中,抽象基类在将公共信息放入很多模型时会非常有用。

如果要实现一个抽象基类,需要先编写好一个基类,然后在该基类中添加Meta类,并填入属性abstract=True。因为这个基类被设计为抽象基类,模型就不会创建任何数据表了。当这个抽象基类用作其他模型类的基类时,其自有字段会自动添加到子类之中。

关于抽象基类的使用方法,示例代码如下:

【代码3-15】

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  
10  class UserInfo(CommonInfo):
11      home_group = models.CharField(max_length=5)
12      #...
13      pass

【代码分析】

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

  • 在第04、05行代码中,定义了name(姓名)和age(年龄)的字段属性。
  • 在第07、08行代码中,在Meta类中添加了属性“abstract=True”,表明CommonInfo类为抽象基类。

在第10、11行代码中,定义了一个关于用户信息的子类UserInfo。具体内容说明如下:

  • 在第10行代码中,定义了子类UserInfo继承自基类CommonInfo。
  • 在第11行代码中,定义了一个关于家庭组的字段属性home_group。

子类UserInfo因为继承自基类CommonInfo,所以顺带继承了基类CommonInfo中的name和age属性,这样子类UserInfo就拥有了3个字段属性,即name、age和home_group。

注意: 因为基类CommonInfo是一个抽象基类,所以它不能作为普通的Django模型来使用。也就是说,基类CommonInfo不会生成数据表,也没有管理器,同时也不能被实例化和保存。

在Django模型中,从抽象基类继承来的字段可以被其他字段或值重写,或者使用“None”标识符进行删除。

对设计人员来讲,从抽象基类中继承是一种比较理想的方式。抽象基类继承方式提供了一种在Python级别中提取公共信息的方法,同时仍会在子类模型中创建数据表。

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

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

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

相关文章

如何完成三只青蛙任务?

如何完成三只青蛙任务? 本文介绍了如何有效完成 三只青蛙任务,包括匹配资源、保护青蛙和拒绝干扰事项。 同时,对于习惯缺乏动力的问题,建议考虑是否有必要去做这个习惯,或者寻找其他激励方法。 大家在践行过程中可能没…

嵌入式面试-回答UART

说明: 此文章是在阅读了一些列面试相关资料之后对于一些常见问题的整理,主要针对的是嵌入式软件面试中涉及到的问答,努力精准的抓住重点进行描述。若有不足非常欢迎指出,感谢!在总结过程中有些答案没标记参考来源&…

密码学 | 数字证书:应用

🥑原文:数字签名和数字证书的原理解读 - 知乎 🥑前文:密码学 | 数字签名 数字证书 - CSDN 🥑提示:把客户端想成 Alice,服务器端想成 Bob 即可。客户端实际上指的是客户端浏览器。 下面&#…

修改Ubuntu22.04系统图标

在Ubuntu 22.04中更改开机时显示的Ubuntu图标需要修改的设置。 主要思路是用自己图片替换系统图片,保持系统图片同名,同格式。 以下是一般的步骤: 修改启动界面的logo: sudo cp 新logo.png /usr/share/plymouth/themes/spinn…

MRHFR:基于不同阅读习惯的多模态虚假新闻检测

一、概述 在多模态领域中,主要存在两个核心问题:一致性对齐问题和交互融合问题。一致性对齐问题主要指不同模态的信息匹配,例如实体对齐、语义对齐,例子有:文本中的“男人”与图片中男子指代一个人。交互融合问题指不同…

Js-JavaScript-三种弹出提示框-alert-confirm-prompt-ai插件

文章目录 1.alert-提示框2.confirm-确认框3.prompt-输入框4.总结 1.alert-提示框 alert (message: string , title: string , errorIcon: Boolean ) Core JavaScript Classes Displays an alert box message: Data Type: string The text to display title (optional): Data Ty…

VSCode插件开发学习

一、环境准备 0、参考文档:VS Code插件创作中文开发文档 1、大于18版本的nodejs 2、安装Yeoman和VS Code Extension Generator: npm install -g yo generator-code 3、生成脚手架 yo code 选择内容: ? What type of extension do yo…

docker pull速度慢解决办法

在使用 Docker 时遇到拉取镜像速度慢的问题,可以使用国内的镜像源可以提高下载速度。 使用阿里镜像加速器 Docker 配置文件位于 /etc/docker/daemon.json。如果文件不存在,可以手动创建它。将以下内容添加到配置文件中: 整体复制执行命令&…

旋转数组的最小数字

旋转数组的最小数字_牛客题霸_牛客网 (nowcoder.com) 描述: 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,…

如何封装Vue组件并上传到npm

前言 环境准备 1.注册npm账号:npm | Home (npmjs.com) 2.保证当前环境安装了vue、webpack、node,以下工作将在该环境下进行(没有的小伙伴自行百度安装哈~) 3.一下用到的环境版本 webpack:v5.1.4node:v…

划分数据集,训练自己的数据集。

数据集划分是跟着up主魔傀面具做的,很好用很方便,推荐给大家,顺便做个例子讲一下怎么使用 把自己的图片数据集放在dataset/VOCdevkit/JPEGImages里面,看看自己的数据集格式,是JPEG还是png格式的还是其他。 然后就是把…

Oracle中的视图

1- 什么是视图 视图是一个虚拟表 视图是由sql查询语句产生的 视图真实存在 但是不存储数据 视图中的数据 只是对 基表(源数据表) 中的数据的引用 总的来说 视图可以简化数据 用户,订单,物流 三个表进行关联 吧很复杂的sql查询语句存储成一个视图 …