Django模型继承之多表继承

在Django模型继承中,支持的第二种模型继承方式是层次结构中的每个模型都是一个单独的模型。每个模型都指向分离的数据表,并且可以被独立查询和创建。在继承关系中,子类和父类之间通过一个自动创建的OneToOneField进行连接。示例代码如下:

【代码3-20】

01  from django.db import models
02  
03  class Place(models.Model):
04      name = models.CharField(max_length=50)
05      address = models.CharField(max_length=80)
06  
07  class Hotel(Place):
08      roomA = models.BooleanField(default=False)
09      roomB = models.BooleanField(default=False)
10      roomC = models.BooleanField(default=False)
11      #...
12      pass

【代码分析】

在第03~05行代码中,定义了一个用于表示地点的抽象基类Place。其中,第04行和第05行代码定义了两个属性name和address,分别用于表示名字和地址。

在第07~10行代码中,定义了一个继承自抽象基类Place的、用于表示酒店的子类Hotel。其中,第08~10行代码定义了3个属性roomA、roomB和roomC,分别用于表示3种酒店房间类型。

另外根据继承规则,抽象基类Place的所有属性在子类Hotel中也均是可以使用的。

因此,基于【代码3-20】的模型设计,可以进行如下操作:

  • >>> Place.objects.filter(name="King's Place")
  • >>> Hotel.objects.filter(name="King's Place ")

假如一个Place对象同时也是Hotel对象,就可以通过小写的模型名将Place对象转换为Hotel对象,示例代码如下:

  • >>> p = Place.objects.get(id=10)
  • # If p is a Hotel object, this will give the child class:
  • >>> p.hotel
  • <Hotel:...>

在上述例子中,如果p不是一个Hotel对象,而仅仅是一个Place对象(又或是其他类的父类对象),那么指向p.hotel就会抛出一个Hotel.DoesNotExist类型的异常。

在Hotel模型中自动创建的、连接至Place模型的OneToOneField看起来类似下面的代码:

【代码3-21】

01  place_ptr = models.OneToOneField(
02      Place, on_delete=models.CASCADE,
03      parent_link=True,
04  )

【代码分析】

设计时可以在Hotel中通过声明自己的OneToOneField,并在其中设置“parent_link=True”属性来重写该字段。

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

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

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

相关文章

Redis的应用场景有哪些

0.什么是Redis&#xff1f; 基于内存的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息代理。Redis 支持多种数据结构&#xff0c;包括字符串&#xff08;String&#xff09;、哈希表&#xff08;Hashes&#xff09;、列表&#xff08;Lists&#xff09;、集合&…

C语言入门课程学习笔记-6

C语言入门课程学习笔记-6 第27课 - 字符数组与字符串&#xff08;上&#xff09;第28课 - 字符数组与字符串&#xff08;下&#xff09;第29课 - 数组专题练习&#xff08;上&#xff09;第30课 - 数组专题练习&#xff08;下&#xff09; 本文学习自狄泰软件学院 唐佐林老师的…

不只有 Spring,这四款Java 基础开发框架同样值得关注!

Java 开发不只有 Spring &#xff0c;今天给大家推荐几个同样优秀的 Java 基础开发框架&#xff0c;为日常项目开发提供更多的选择。答应我&#xff0c;请不要再叫我 Spring 小子了&#xff0c;​好吗&#xff1f; 项目概览&#xff1a; Guice&#xff1a;轻量级依赖注入框架 …

2024Mac系统热门游戏排行榜 Mac支持的网络游戏有哪些?mac能玩哪些大型网游 苹果电脑Mac游戏资源推荐 Mac玩Windows游戏

“游戏是这个世界上唯一能和女性争夺男朋友的东西&#xff08;/滑稽&#xff0c;有不少女生也喜欢玩游戏&#xff09;。” 虽然只是一句玩笑话&#xff0c;不过也可以看出游戏对大多数男生来说是必不可少的一项娱乐活动了。而网络游戏是游戏中的一大分支&#xff0c;能让玩家们…

科技“冷”战:NIST刷新制冷效率,中国实力逆境崛起!

4月23日&#xff0c;美国国家标准与技术研究院&#xff08;NIST&#xff09;的研究人员报道称&#xff0c;他们通过对常用于科研和工业领域的制冷机进行改装&#xff0c;显著降低了将材料冷却至略高于绝对零度所需的时间和能量。 科学家们指出&#xff0c;他们的原型设备每年能…

Linux 学习之路 -- 进程篇 -- 进程控制

目录 一、进程终止 <1>使用语言和系统自带的方法&#xff0c;进行转换 <2>自定义错误码 <3>小结&#xff1a; <2>两个接口exit / _exit 二、进程等待 <1>简单了解 <2>wait调用 <3>waitpid调用 <4>status <1>W…

复杂的字符串算法——KMP算法

字符串算法 模式匹配&#xff08;Pattern Matching&#xff09;&#xff1a;在一篇长度为 &#x1d45b; 的文本 &#x1d446; 中&#xff0c;找某个长度为 &#x1d45a; 的关键词 &#x1d443;。&#x1d443; 可能多次出现&#xff0c;都需要找到。 最优的模式匹配算法复…

UML 的工厂方法设计模式 策略设计模式 抽象工厂设计模式 观察者设计模式

UML 的工厂方法设计模式 UML 的工厂方法设计模式是一种创建型设计模式&#xff0c;它通过定义一个创建对象的接口&#xff0c;但将具体的对象创建延迟到子类中。这样可以让子类决定实例化哪个类。该模式提供了一种创建对象的灵活方式&#xff0c;同时也隐藏了对象的具体实现细…

AHB传输---突发操作

突发操作 在本协议中定义了4拍、8拍和16拍的突发&#xff0c;以及未定义长度的突发和单次传输。它支持增量和包装突发&#xff1a; 增量突发访问连续位置&#xff0c;每个传输的地址是前一个地址的增量。包装突发在跨越地址边界时会包装。地址边界的计算方法是突发中拍数与传…

Android—统一依赖版本管理

依赖版本管理有多种方式 config.gradle 用于Groovy DSL&#xff0c;新建一个 config.gradle 文件&#xff0c;然后将项目中所有依赖写在里面&#xff0c;更新只需修改 config.gradle文件内容&#xff0c;作用于所有module buildSrc 可用于Kotlin DSL或Groovy DSL&#xff0c;…

MATLAB冒号表示法

MATLAB 冒号表示法 colon(:)是在MATLAB中最有用的运算符之一。它用于创建向量&#xff0c;下标数组和指定迭代。 如果要创建包含1到10的整数的行向量&#xff0c;请编写- 示例 1:10 MATLAB执行该语句并返回包含1到10的整数的行向量- ans 1 2 3 4 5 6 7 8 9 10 如果要指定一…

github Copilot的使用总结

1. 代码建议和补全 GitHub Copilot 的基本使用涉及编写代码时的实时代码建议和补全。一旦你已经安装并配置好 GitHub Copilot 插件&#xff0c;你可以在支持的编辑器&#xff08;如 Visual Studio Code&#xff09;中开始使用 Copilot。以下是一些基本的使用步骤&#xff1a; …

VBA技术资料MF146:发出多次Beep提示声

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Pandas 2.2 中文官方教程和指南(十七)

原文&#xff1a;pandas.pydata.org/docs/ 重复标签 原文&#xff1a;pandas.pydata.org/docs/user_guide/duplicates.html Index对象不需要是唯一的&#xff1b;你可以有重复的行或列标签。这一点可能一开始会有点困惑。如果你熟悉 SQL&#xff0c;你会知道行标签类似于表上的…

TCP/IP协议族中的TCP(三):解析其关键特性与机制

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 前言 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是互联网协议族中至关重要的组成部…

08.OSPF的特殊区域及其特点

OSPF特殊区域 Stub 末梢区域&#xff0c;处在AS的边缘&#xff0c;只有连接其他区域的ABR&#xff0c;没有ASBR&#xff0c;没有虚连接穿越的非骨干区域 只能接收LSA1和LSA2与 LSA3&#xff0c;不能接收LSA4和LSA5区域内部路由与外部AS路由通信&#xff0c;由本区域的ABR&am…

K8S 部署和访问 Kubernetes 仪表板(Dashboard)

文章目录 部署 Dashboard UI浏览器访问登陆系统 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览…

unit4.web服务的部署及高级优化方案

搭建web服务器要求如下&#xff1a; 1.web服务器的主机ip&#xff1a;172.25.254.100 [rootserver101 桌面]# vmset.sh 100 连接已成功激活&#xff08;D-Bus 活动路径&#xff1a;/org/freedesktop/NetworkManager/ActiveConnection/3&#xff09; [rootserver101 桌面]# ifc…

Swift中TableView的编辑模式

Swift中TableView的编辑模式可以通过UITableView的属性isEditing来控制。 要将TableView设置为编辑模式&#xff0c;可以使用以下代码&#xff1a; tableView.isEditing true要退出编辑模式&#xff0c;可以使用以下代码&#xff1a; tableView.isEditing false当TableVie…

鑫海移民荣耀呈现:EB5投资移民盛宴落幕,卓越项目引领投资新潮

随着春日的暖阳渐渐铺满大地&#xff0c;我们鑫海移民集团在这个充满希望的季节里&#xff0c;举办了一场意义非凡的EB5投资移民专题活动。于2024年4月27日&#xff08;周六&#xff09;下午13:30&#xff0c;在北京渤海润泽威斯汀酒店隆重举行&#xff0c;我们与众多热情的参与…