Abstract base classes
在元數(shù)據(jù)中設(shè)置Meta中設(shè)置 abstract=True
,這個model將用于創(chuàng)建任何數(shù)據(jù)表.當(dāng)它被作為基類時.他的字段添加進(jìn)這些子類當(dāng)中,
注意:
1.如果抽象類和基類有相同名稱的字段會產(chǎn)生一個異常.
2.基類不會產(chǎn)生一個數(shù)據(jù)表或者生成一個管理器,也不能被直接實例化調(diào)用.
from django.db import models
class Base(models.Model):
m2m = models.ManyToManyField(OtherModel, related_name="%(app_label)s_%(class)s_related")
class Meta:
abstract = True
class ChildA(Base):
pass
class ChildB(Base):
pass
Meta inheritance
django允許聲明各種meta屬性,如果子類沒有聲明,他將自動繼承父類的,也可以繼承然后擴(kuò)展
class Meta(father_class.Meta):
db_table = 'child_info'
db_table將意味著所有的子類(那些沒有指定自己的Meta)將使用同一數(shù)據(jù)庫石景,這肯定不會是你想要的够掠。
Multi-table inheritanceDjango支持的第二種model繼承是多表繼承,在繼承結(jié)構(gòu)中每個model都是獨立的雅任。都對應(yīng)著自己的數(shù)據(jù)庫表,可以進(jìn)行獨立的查詢等操作黍瞧。繼承關(guān)系實際是子model和每個父model之間的關(guān)系(通過自動創(chuàng)建OneToOneField)
from django.db import model
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)
所有Place的字段都可以在Restaurant中使用,雖然數(shù)據(jù)存放在不同的數(shù)據(jù)表中
Proxy models
當(dāng)使用多表繼承時一個新的數(shù)據(jù)表model會在每一個子類中創(chuàng)建挨决,這是因為子model需要存儲父mdoel不存在的一些數(shù)據(jù)字段。但有時只需要改變model的操作行為脖祈,可能是為了改變默認(rèn)的管理行為或添加新的方法。
這時就應(yīng)該使用代理模式的繼承:創(chuàng)建原始model的代理刷晋。你可以創(chuàng)建一個用于 create, delete 和 update的代理model,使用代理model的時候數(shù)據(jù)將會真實保存。這和使用原始model是一樣的眼虱,所不同的是當(dāng)你改變model操作時,不需要去更改原始的model蒙幻。
代理模式的聲明和正常的繼承聲明方式一樣。你只需要在Meta class 中定義proxy為True就可以了邮破。