Django模型继承之多表继承

ops/2024/12/22 9:08:52/

在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.ppmy.cn/ops/14458.html

相关文章

Java23种设计模式-创建型模式之抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式&#xff0c;它用于创建相关或相互依赖对象的一组&#xff0c;而无需指定其具体的类。这种模式特别适用于产品族的情况&#xff0c;即一组相互关联的产品对象。 存在四种角色&#xff1a; 角色1&#xff1a;抽象工…

C++ 继承

C/C总述&#xff1a;Study C/C-CSDN博客 目录 基类&派生类 访问控制和继承 继承基类成员访问方式的变化 改变访问权限 继承中的作用域 派生类的默认成员函数 继承的静态成员与友元 多继承与菱形继承 虚拟继承 继承与组合 面向对象程序设计中最重要的一个概念是…

2、选择什么样的机器人本体

如果说世界是物质的&#xff0c;那么应该先制造出机器人的本体&#xff0c;再让她产生灵魂。如果是精神的呢&#xff0c;世界是无中生有的呢&#xff0c;那就先在仿真中研究算法吧。 而我比较崇尚初中哲学的一句话&#xff0c;世界是物质的&#xff0c;物质是运动的&am…

【随想录】Day31—第八章 贪心算法 part01

目录 题目1: 455. 分发饼干1- 思路2- 题解⭐分发饼干 ——题解思路 题目2: 摆动序列1- 思路2- 题解⭐摆动序列 ——题解思路 题目3: 最大子数组和1- 思路2- 题解⭐ 最大子数组和 ——题解思路 题目1: 455. 分发饼干 题目链接&#xff1a;455. 分发饼干 1- 思路 贪心的思路&am…

Scala详解(6)

Scala 集合 字符串 Scala中字符串同样分为可变字符串和不可变字符串&#xff0c;不可变字符串使用String来定义&#xff0c;可变字符串使用的是StringBuilder来定义 package com.fesco.string ​ object StringDemo { ​def main(args: Array[String]): Unit { ​// 可变字符…

【03-掌握Scikit-learn:深入机器学习的实用技术】

文章目录 前言数据预处理缺失值处理数据缩放特征选择模型训练参数调整模型评估总结前言 经过了对Python和Scikit-learn的基础安装及简单应用,我们现在将更深入地探究Scikit-learn的实用技术,以进一步提升我们的数据科学技能。在本文中,我们将涵盖数据预处理、特征选择、模型…

《深入浅出.NET框架设计与实现》笔记6.4——ASP.NET Core应用程序多种运行模式之四——服务承载

ASP.NET Core应用程序可以在多种运行模式下运行&#xff0c;包括自宿主&#xff08;Self-Hosting&#xff09;、IIS服务承载、桌面应用程序、服务承载。 因此选择和时的模式很重要。 服务承载 在服务承载模式下&#xff0c;ASP.NET Core应用程序将注册为Windows服务&#xf…

【论文阅读】BGE Landmark Embedding: 一种用于大语言模型长上下文检索增强的嵌入方法

大语言模型&#xff08;LLM&#xff09;在面对许多应用时需要能够处理长序列输入&#xff0c;检索增强是处理长上下文语言建模的一种非常有效的方法。然而&#xff0c;现有的检索方法通常与分块的上下文一起工作&#xff0c;这容易导致语义表示质量低下和有用信息检索不完整。今…