本文内容来源于 Django 文档,学习所在。如若有问题,请移步官方地址。
Django 中所有的模型都必须继承自 django.db.models.Model
,直接继承或者间接继承都可以。
你需要确定的是父模型本身是模型还是只是一个子模型中的公共部分。
三种可能的继承方式:
- 抽象基类
父模型不会在数据库中创建真实数据表,它只是子模型中的公共字段,只不过将其提取到了父模型中而已。减少代码量。
abstract=True
是关键。
from django.db import models
class CommonInfo(models.Model):
name = models.CharField(max_length=100)
age = models.PositiveIntegerField()
class Meta:
abstract = True
ordering = ['name']
class Student(CommonInfo):
home_group = models.CharField(max_length=5)
注意:
related_name和related_query_name参数可能会有不同的行为。
- 多表继承
如果你是现有模型的子类(可能是完全来自另一个应用程序的东西),并希望每个模型都有自己的数据库表,那么多表继承是最佳选择。
from django.db import models
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(Place):
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
注意:
Meta
并不能直接继承,但也有一些特殊行为,如 ordering
和 get_latest_by
。
尽可能的重写 class Meta
- 代理模型
如果你只想修改模型的 Python 层面行为,而不以任何方式更改模型字段,则可以使用代理模型。不创建新的表
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class MyPerson(Person):
class Meta:
proxy = True
def do_something(self):
# ...
pass
`