Django ORM模型继承的三种实现方式详解

何川
何川
发布时间:2026-10-13| 3人浏览过
原创

本文深入解析Django框架中ORM模型继承的三种核心模式:抽象基类、多表继承及代理模型。通过具体代码示例,详细阐述各类继承在数据库表结构生成、字段映射及元数据管理上的差异,帮助开发者根据实际需求选择最优的数据模型设计方案。

本文详细介绍Django框架中面向对象ORM模型继承的具体用法,旨在为读者提供实用的参考指南。

Django ORM模型继承概述

Django ORM巧妙地将Python面向对象编程特性与关系型数据库表结构相结合,提供了三种不同风格的模型继承机制。

第一种是抽象类继承:父类需继承自models.Model,但该父类不会在底层数据库中生成对应的数据表,其属性列将合并存储到子类的数据表中。

第二种是多表继承:在此模式下,每个模型类(包括父类和子类)都会在底层数据库中生成独立的数据表来管理各自的数据。

第三种是代理模型继承:父类负责在底层数据库中管理实际的数据表,而子类不定义新的数据列,仅用于定义查询数据表时的元数据,如排序方式等。

抽象基类继承详解

以下通过具体示例展示抽象基类继承的实现方式。


from django.db import models
class Message(models.Model):
  id    = models.AutoField(default=0)
  content  = models.CharField(max_length=100)
  user_name = models.CharField(max_length=80)
  pub_date = models.DateField()
  class Meta:
    abstract = True #证明该类是抽象基类
class Moment(Message):
  headline = models.CharField(max_length=50)
LEVELS = (
  ('1', 'Very Good'),
  ('2', 'Good'),
  ('3', 'Normal'),
  ('4', 'Bad'),
)
class Coment(Message):
  level = models.CharField(max_length=50, choices=LEVELS, default=LEVELS[3])

定义一个抽象基类Message,包含四个字段:id、content、user_name和pub_date。子类Moment和Coment分别继承自Message,并各自定义一个独有的字段。这三个类映射到数据库时,会生成两个数据表(抽象基类Message本身不生成数据表)。

生成的数据表app_Moment(app为应用名称)包含五个字段:id、user_name、content、pub_date和headline。

生成的数据表app_Coment包含五个字段:id、user_name、content、pub_date和level。

多表继承实现方式

接下来介绍多表继承的实现方式。


from django.db import models
class Message(models.Model):
  id    = models.AutoField(default=0)
  content  = models.CharField(max_length=100)
  user_name = models.CharField(max_length=80)
  pub_date = models.DateField()
class Moment(Message):
  headline = models.CharField(max_length=50)
LEVELS = (
  ('1', 'Very Good'),
  ('2', 'Good'),
  ('3', 'Normal'),
  ('4', 'Bad'),
)
class Coment(Message):
  level = models.CharField(max_length=50, choices=LEVELS, default=LEVELS[3])

定义类Message,包含四个字段:id、content、user_name和pub_date。子类Moment和Coment分别继承自Message,并各自定义一个独有的字段。这三个类映射到数据库时,会生成三个独立的数据表。

生成的数据表app_Moment(app为应用名称)包含五个字段:id、user_name、content、pub_date和headline。

生成的数据表app_Coment包含五个字段:id、user_name、content、pub_date和level。

生成的数据表app_Message包含四个字段:id、user_name、content和pub_date。

在多表继承场景中,可以通过子类实例中用小写父类名访问父类的实例。

例如:


al = Moment(xx, user_name="test")
print(al.message.user_name) #-------> test

代理模型继承应用

最后介绍代理模型继承。

前两种继承模式中,子类都承担实际数据存储的作用;而代理模型继承父类数据但不存储实际数据,通过在子类的Meta类中定义proxy=True属性来实现。


from django.db import models
class Mement(models. Model):
  id    = models.AutoField(default=0)
  content  = models.CharField(max_length=100)
  user_name = models.CharField(max_length=80)
  pub_date = models.DateField()
class OrderByMoment(Moment): #使用代理模型继承的原因是子类中新的特性不会影响父类的模型及其已有代码的行为
  class Meta:
    proxy  = True
    ordering = ['-pub_date']  #Moment根据pub_date倒序排列

Moment类用于存储数据,而OrderByMoment类则用于管理根据pub_date字段倒序排列的Moment数据。

希望上述关于Django框架Python程序设计的模型继承介绍能对大家有所帮助。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。