0

0

Python Django模型怎么继承_抽象基类abstract=True与多表真实关联继承底层区别解析

P粉602998670

P粉602998670

发布时间:2026-03-12 10:58:03

|

163人浏览过

|

来源于php中文网

原创

抽象基类(abstract=True)不生成数据库表,仅用于代码复用,其字段被复制到各子类表中;多表继承则为父类建真实表,并通过OneToOneField关联子类。

python django模型怎么继承_抽象基类abstract=true与多表真实关联继承底层区别解析

抽象基类 abstract=True 不会生成数据库表

抽象基类只是代码复用机制,Django 在迁移时完全跳过它,不会为 abstract=True 的模型建表。它的字段会“复制”到每个继承它的具体模型中,就像手动把字段定义粘贴过去一样。

常见错误现象:python manage.py makemigrations 后发现抽象基类没出现在迁移文件里,或执行 python manage.py showmigrations 时看不到对应记录——这正常,不是漏了。

  • 所有子类各自生成独立表,字段重复存在(比如 created_atUserArticle 表里各有一份)
  • 不能对抽象基类做 MyAbstractModel.objects.all(),会报 AttributeError: type object 'MyAbstractModel' has no attribute 'objects'
  • 如果基类定义了 Meta.orderingMeta.verbose_name,子类默认继承,但可被覆盖

多表继承会为父类建真实表并加 OneToOneField 隐式关联

只要不设 abstract=True,哪怕父类没有显式字段,Django 也会为它单独建一张表,并在子类表里加一个指向它的 OneToOneField(字段名默认是父类小写名,如 place_ptr)。

使用场景:需要复用逻辑 + 共享部分数据(比如多个模型都共用地址、状态、审核人等),且这些字段值在不同子类型间要保持唯一或可统一查询。

立即学习Python免费学习笔记(深入)”;

  • 父类实例必须先保存才能创建子类实例,否则抛 ValueError: "Place" needs to have a value for field "id" before this many-to-one relationship can be used.
  • 子类查询时默认走 JOIN(如 Restaurant.objects.select_related('place')),性能敏感时得留意 N+1 或冗余 JOIN
  • 父类表的主键(id)会同时作为子类表的主键和外键,所以 Restaurant.objects.get(id=1)Place.objects.get(id=1) 实际指向同一行物理记录

abstract=True 下字段定义位置影响实际效果

字段写在抽象基类里,还是在子类里重定义,结果可能不同。尤其涉及 related_namedb_columndefault 这类参数时,容易误以为“继承了配置”,其实只是文本复制。

Krea AI
Krea AI

多功能的一站式AI图像生成和编辑平台

下载

例如:抽象基类定义了 status = models.CharField(max_length=20, default='draft'),子类没重写,那每个子表都会带这个字段和默认值;但如果子类自己再写一遍 status,哪怕只改 default,就变成两个独立字段定义,Django 不合并也不警告。

  • related_name 必须显式设置,否则 Django 会自动生成(如 user_set),多个子类继承同一抽象类时若不设,会因反向名冲突导致 makemigrations 失败
  • db_column 在抽象类中指定后,子类表字段名就是那个值;但如果子类又定义同名字段,就覆盖了——不是叠加,是替换
  • 函数默认值(如 default=timezone.now)没问题,但写成 default=timezone.now() 就会在模块加载时执行一次,所有实例共享同一个时间戳

什么时候该选 abstract=True,什么时候该用多表继承

本质区别不在“要不要复用代码”,而在于“要不要共享数据行”。如果字段只是结构相似、语义无关(比如所有模型都要有 created_at),用抽象基类;如果不同模型实例之间存在事实上的父子归属(比如 Restaurant 是一种 Place),且业务上需要按 Place 统一筛选、更新、计数,那就得多表继承。

容易踩的坑:为了图省事把本该是多表继承的场景硬改成抽象基类,结果后面发现没法统一查“所有营业场所”,只能靠 UNION 或应用层聚合,反而更重。

  • 抽象基类适合:审计字段(created_at, updated_by)、软删除标记(is_deleted)、通用状态机字段
  • 多表继承适合:有明确 IS-A 关系的领域模型(Employee / Manager 都是 Person)、需统一管理生命周期的资源(ImageFile, VideoFile 都是 MediaFile
  • 两者都不能解决“一个子类想继承多个父类”的需求——Django 不支持多重继承,此时只能靠组合(ForeignKey)或第三方库如 django-model-utilsInheritanceManager

抽象基类看着轻量,但字段复制多了,迁移和索引维护成本会上升;多表继承看着重,但数据关系清晰,SQL 层面更容易优化。选哪个,取决于你愿不愿意让数据库知道“它们是一家人”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1133

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2174

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1683

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号