【Django】model模型—模型继承

Django中三种继承风格

  • 抽象基类:仅将父类用于子类公共信息的载体,这样的父类永远都不会单独使用。
  • 多表继承:继承了一个模型(可能来源其它应用),且想要每个模型都有对应的数据表。
  • 代理模型:只想修改模型的 Python 级行为,而不是以任何形式修改模型字段。

抽象基类

有很多模型需要公共信息的时候,抽象基类就会有用,比如一个后台管理系统,都需要一些用于审计的字段。
例子:

from django.db import modelsclass CommonInfo(models.Model):name = models.CharField(max_length=100)age = models.PositiveIntegerField()class Meta:abstract = Trueclass Student(CommonInfo):home_group = models.CharField(max_length=5)

关于Meta继承

当一个抽象基类被建立,Django 将所有你在基类中申明的 Meta 内部类以属性的形式提供。若子类未定义自己的 Meta 类,它会继承父类的 Meta。Django 在安装 Meta 属性前,对抽象基类的 Meta 做了一个调整——设置 abstract=False。这意味着抽象基类的子类不会自动地变成抽象类。为了继承一个抽象基类创建另一个抽象基类,你需要在子类上显式地设置 abstract=True。
由于Python继承的工作方式,如果子类从多个抽象基类继承,则默认情况下仅继承第一个列出的类的 Meta 选项。为了从多个抽象类中继承 Meta 选项,必须显式地声明 Meta 继承。

关于对 related_name 和 related_query_name 的使用

若你在 外键 或 多对多字段 使用了 related_name 或 related_query_name,你必须为该字段提供一个 独一无二 的反向名字和查询名字。这在抽象基类中一般会引发问题,因为基类中的字段都被子类继承,且保持了同样的值(包括 related_name 和 related_query_name)。

为了解决此问题,当你在抽象基类中(也只能是在抽象基类中)使用 related_name 和 related_query_name,部分值需要包含 ‘%(app_label)s’ 和 ‘%(class)s’。

多表继承

Django 支持的第二种模型继承方式是层次结构中的每个模型都是一个单独的模型。每个模型都指向分离的数据表,且可被独立查询和创建,即:多表继承,它是使用隐式的 OneToOneField 连接子类和父类。

例子:

from django.db import modelsclass Place(models.Model):name = models.CharField(max_length=50)address = models.CharField(max_length=80)class Restaurant(Place):serves_hot_dogs = models.BooleanField(default=False)serves_pizza = models.BooleanField(default=False)

关于Meta的多表继承

多表继承情况下,子类不会继承父类的 Meta。所有 Meta 类选项已被应用至父类,在子类中再次应用会导致行为冲突(与抽象基类中应用场景对比,这种情况下,基类并不存在)。

故,子类模型无法访问父类的 Meta 类。不过,有限的几种情况下:若子类未指定 ordering 属性或 get_latest_by 属性,子类会从父类继承这些。
如果父类有排序,而你并不期望子类有排序,你可以显式的禁止它:

class ChildModel(ParentModel):# ...class Meta:# Remove parent's ordering effectordering = []

代理模型

代理模型继承的目的:为原模型创建一个代理。你可以创建,删除和更新代理模型的实例,所以的数据都会存储的像你使用原模型(未代理的)一样。不同点是你可以修改代理默认的模型排序和默认管理器,而不需要修改原模型。

代理模型就像普通模型一样申明。你需要告诉 Django 这是一个代理模型,通过将 Meta 类的 proxy 属性设置为 True。

例子:

from django.db import modelsclass Person(models.Model):first_name = models.CharField(max_length=30)last_name = models.CharField(max_length=30)class MyPerson(Person):class Meta:proxy = Truedef do_something(self):# ...pass

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

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

相关文章

JProfiler相关问题及答案(2024)

1、JProfiler是什么及其用途 JProfiler是一款功能丰富的商业Java性能剖析(profiling)工具,它主要面向开发者和性能分析师,用于监测和分析Java应用程序的运行时行为。以下是对JProfiler的一些详细介绍和它的主要用途: …

webpack的一些知识

核心 webpack 是用来搭建前端工程的它运行在node环境中,它所做的事情,简单来说,就是打包具体来说,就是以某个模块作为入口,根据入口分析出所有模块的依赖关系,然后对各种模块进行合并、压缩,形…

洛谷P1157 组合的输出

深搜板子加一点点修改&#xff0c;适合初学者体会深搜&#xff0c;具体看代码 题目链接 ACcode #include<bits/stdc.h>using namespace std;int a, b;bitset<50>vis;//剪枝 int d[50];void dfs(int x) {if (x b 1) {for (int i 1;i < b;i)cout << se…

HBM(High Bandwidth Memory)

选择正确的高带宽内存 构建高性能芯片的选择越来越多&#xff0c;但附加内存的选择却几乎没有变化。为了在汽车、消费和超大规模计算中实现最大性能&#xff0c;选择取决于一种或多种 DRAM&#xff0c;而最大的权衡是成本与速度。 尽管多年来人们一直在努力用更快、更便宜或更…

Linux:kubernetes(k8s)搭建mater节点(kubeadm,kubectl,kubelet)(2)

安装k8有多种方式如&#xff1a; minikube kubeadm 二进制安装 命令行工具 我这里就使用kubeadm进行安装 环境 3台centos7 master ip &#xff1a;192.168.113.120 2G运存 2内核 node1 ip &#xff1a;192.168.113.121 2G运存 2内核 node2 ip &#xff1a;192.168.1…

重构与设计模型的完美融合:构建稳定可扩展系统的关键步骤

在软件开发的漫长旅程中&#xff0c;系统的稳定性和可扩展性一直是开发者们追求的目标。为了实现这一目标&#xff0c;重构和设计模型成为了不可或缺的两个关键元素。本文将探讨如何通过重构&#xff0c;使系统更稳定、更具可扩展性&#xff0c;并深入研究如何将重构与设计模型…

JavaEE:多线程(3):案例代码

目录 案例一&#xff1a;单例模式 饿汉模式 懒汉模式 思考&#xff1a;懒汉模式是否线程安全&#xff1f; 案例二&#xff1a;阻塞队列 可以实现生产者消费者模型 削峰填谷 接下来我们自己实现一个阻塞队列 1.先实现一个循环队列 2. 引入锁&#xff0c;实现线程安全 …

运用qsort函数进行快排并使用C语言模拟qsort

qsort 函数的使用 首先qsort函数是使用快速排序算法来进行排序的&#xff0c;下面我们打开官网来查看qsort是如何使用的。 这里有四个参数&#xff0c;首先base 是至待排序的数组的首元素的地址&#xff0c;num 是值这个数组的元素个数&#xff0c;size 是指每个元素的大小&am…

Python猜数字小游戏

下面这段代码是一个简单的数字猜测游戏&#xff0c;其中计算机已经提前计算出了414 // 23的结果并存储在变量num中。然后&#xff0c;程序会提示用户来猜测这个结果。 以下是代码的主要步骤和功能&#xff1a; 初始化&#xff1a; num 414 // 23&#xff1a;计算414除以23的整…

Linux:各目录含义

简介 学习Linux各目录含义之前&#xff0c;我们首先要了解一下Filesystem Hierarchy Standard&#xff08;文件系统层次结构标准&#xff09;。 FHS FHS&#xff0c;即文件系统层次结构标准&#xff08;Filesystem Hierarchy Standard&#xff09;&#xff0c;是Linux和类Un…

深入了解Redis:配置文件、动态修改和安全设置

Redis 是一个开源的内存中数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。在使用 Redis 时&#xff0c;了解其配置选项是至关重要的。本文将详细介绍 Redis 的配置文件和常用配置项&#xff0c;并提供一些示例来说明如何设置和修改这些配置。 Redis 配置文…

基于stm32F103的座面声控台灯

1.基本内容&#xff1a; 设计一个放置在桌面使用的台灯&#xff0c;使用220v交流电供电。具备显示屏能够实时显示日期&#xff08;年、月、日和星期&#xff09;&#xff0c;时间&#xff08;小时、分钟、秒&#xff09;和温度&#xff08;摄氏度&#xff09;&#xff1b;能够通…

Python爬取天气数据及可视化分析!(含源码)

天气预报我们每天都会关注&#xff0c;我们可以根据未来的天气增减衣物、安排出行&#xff0c;每天的气温、风速风向、相对湿度、空气质量等成为关注的焦点。本次使用python中requests和BeautifulSoup库对中国天气网当天和未来14天的数据进行爬取&#xff0c;保存为csv文件&…

帆软下载PDF报错java.lang.OutOfMemoryError: Java heap space

需求:前端选择多条数据&#xff0c;点击下载按钮&#xff0c;下载帆软报表的pdf格式。 &#xff08;目前用的是帆软PDF下载接口&#xff0c;然后java转成文件流&#xff0c;前端接到后端接口的文件流&#xff0c;使用axios下载blob,再创建下载链接&#xff0c;通过link标签实现…

ArduinoTFTLCD应用

ArduinoTFTLCD应用 ArduinoTFTLCD应用硬件连接软件导入库显示数字、字符显示汉字方案1方案2 显示图片 总结 ArduinoTFTLCD应用 对于手工喜欢DIY的人来说&#xff0c;Arduino驱动的TFTLCD被很多人使用&#xff0c;此处就总结一下&#xff0c;使用的是VScode的PlatformIO插件驱动…

C# API异步方法和返回类型:提升应用程序性能和灵活性

摘要&#xff1a; 异步编程是现代应用程序开发中不可或缺的一部分。在C#中&#xff0c;异步方法允许我们在等待操作完成时继续执行其他任务&#xff0c;从而提高应用程序的性能和响应性。本文将介绍C# API异步方法的基本概念、原理和实际应用&#xff0c;并详细讨论异步方法的返…

【机器学习】实验5,AAAI 会议论文聚类分析

本次实验以AAAI 2014会议论文数据为基础&#xff0c;要求实现或调用无监督聚类算法&#xff0c;了解聚类方法。 任务介绍 每年国际上召开的大大小小学术会议不计其数&#xff0c;发表了非常多的论文。在计算机领域的一些大型学术会议上&#xff0c;一次就可以发表涉及各个方向…

RNA-Seq 笔记 [4]

***********************该笔记为初学者笔记&#xff0c;仅供个人参考谨慎搬运代码****************************** samtools 排序压缩和 featureCounts 生成基因计数表 SAM文件和BAM文件 1.SAM格式&#xff1a;是一种通用的比对格式&#xff0c;用来存储reads到参考序列的比…

2024最新算法:鳑鲏鱼优化算法(Bitterling Fish Optimization,BFO)求解23个基准函数(提供MATLAB代码)

一、鳑鲏鱼优化算法 鳑鲏鱼优化算法&#xff08;Bitterling Fish Optimization&#xff0c;BFO&#xff09;由Lida Zareian 等人于2024年提出。鳑鲏鱼在交配中&#xff0c;雄性和雌性物种相互接近&#xff0c;然后将精子和卵子释放到水中&#xff0c;但这种方法有一个很大的缺…

BUUCTF---[极客大挑战 2019]Upload1

1.题目描述 2.点开链接&#xff0c;需要上传文件&#xff0c;要求是image&#xff0c;上传文件后缀为jpg的一句话木马&#xff0c;发现被检测到了 3.换另一个木马试试 GIF89a? <script language"php">eval($_REQUEST[1])</script> 发现可以上传成功 4…