添加或修改数据模型都不能马虎,有关数据的操作都需慎重考虑。
推荐使用的 Django 数据模型相关的包:
- django-model-utils: 使用其 TimeStampedModel
- django-extensions: 使用其管理命令 shell_plus,它会自动加载所有已安装应用的数据模型
基础
将具有很多数据模型的应用进行拆分
推荐每个应用的数据模型数不超过 5 个。如果一个应用的数据模型数太多,意味着该应用做的事太多了,需要进行拆分。
慎重选择数据模型继承方式
Django 支持三种继承方式:
- 抽象基类
- 多表继承
- 代理模型
Django 抽象基类和 Python 的抽象基类是不同的!,它们有不同的目的和行为。
各种继承方式的优缺点:
继承方式 | 优点 | 缺点
------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|
抽象基类:只有继承的子数据模型才会创建数据表 | 能在抽象父类中定义共同项来减少重复输入,同时没有多表继承的额外数据表和 join 操作的开销 | 父类不能单独使用
多表继承:父类和子类都会创建对应的数据表。两者之间隐含有一个 OneToOneField 关联 | 因每个数据模型都有表,故可对父子各自进行查询操作。同时可以通过 parent.child 从父对象直接访问子对象 | 对子表的查询都会有一个与其所有父表的 join 操作。非常不推荐使用多表继承!
代理模型:只为原始数据模型创建数据表 | 可以为原始数据模型创建一个别名,并添加不同的 Python 行为 | 无法修改数据模型项
如何确定应该使用哪种继承方式:
- 如果重叠量很少(只有一两个项),则不需要用继承,只需在两个数据模型中都进行定义
- 如果两者间有较多的重复项,则应重构代码,将相同项放置到一个抽象基类中
- 代理模型有时会很有用,但它与其它两种模型继承方式非常不同
- 应避免使用多表继承,因其即增加了复杂度又提高了性能开销。可以用 OneToOneField 及 ForeignKeys 来代替。
数据模型继承实践: TimeStampedModel
在数据模型中增加 created 和 modified 两个时间戳项是个普遍的需求。可以写一个 TimeStampedModel 基类如下:
# core/models.py
from django.db import models
class TimeStampedModel(models.Model):
"""
An a