本文內(nèi)容來源于 Django 文檔,學(xué)習(xí)所在。如若有問題,請移步官方地址。
Django 中所有的模型都必須繼承自 django.db.models.Model,直接繼承或者間接繼承都可以。
你需要確定的是父模型本身是模型還是只是一個子模型中的公共部分。
三種可能的繼承方式:
- 抽象基類
父模型不會在數(shù)據(jù)庫中創(chuàng)建真實數(shù)據(jù)表,它只是子模型中的公共字段,只不過將其提取到了父模型中而已。減少代碼量。
abstract=True是關(guān)鍵。
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參數(shù)可能會有不同的行為。
- 多表繼承
如果你是現(xiàn)有模型的子類(可能是完全來自另一個應(yīng)用程序的東西),并希望每個模型都有自己的數(shù)據(jù)庫表,那么多表繼承是最佳選擇。
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 層面行為,而不以任何方式更改模型字段,則可以使用代理模型。不創(chuàng)建新的表
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
`