我有这个型号:
class BillHeader(models.Model):
billno = models.IntegerField(primary_key=True, blank=True)
class BillData(models.Model):
price = models.DecimalField(_('Price'), max_digits=12, decimal_places=2)
amount = models.DecimalField(_('Amount'), max_digits=6, decimal_places=2)
[... rest of the model ...]
class Meta:
abstract = True
class BillFooter(models.Model):
total = models.DecimalField(_('Total'), max_digits=12, decimal_places=2)
[... rest of the model ...]
class Meta:
abstract = True
BillData
和BillFooter
对于每个BillHeader
都是通用的,因此我将其标记为abstract
。我能做class BillHeader(BillData, BillFooter)
还是我做错了什么?
我还考虑过做主BillData
和BillHeader
BillFooter
摘要。我没有任何做数据模型的经验(至少不是复杂的模型)而且我有点迷失。你会推荐什么?
答案 0 :(得分:8)
是的,Django模型可以从任意数量的抽象基类继承,只要它们不会导致模糊的“模型解析顺序”。将继承视为一个链......您继承的每个类都是链中的一个链接。继承两个基类只是添加两个链接到链而不是一个。
换句话说,如果您的抽象基类继承自models.Model
,那么不要尝试继承{{1>}中的抽象基类和 models.Model
。 1}}类。 Bill
已经在继承链中,因此继承它会导致基类链中的混乱。
至于 I 将如何构建这些类,我将创建一个名为models.Model
的模型,该模型继承自Bill
,BillHeader
和{{1} }。原因是我喜欢我的Django模型来表示离散对象(例如Bill,Article,BlogPost,Photo等)。
然而,抽象基类的要点是能够为公共字段和方法添加抽象级别,以便多个类可以从它们继承。如果你只是创建一个比尔类,它有点无意义。但是,如果你有Bill,UnpaidBill和PaidBill ......所有这些都会有共同字段出现在所有这些字段上,你可以通过抽象到ABC来节省很多麻烦。
希望能够提供一些有关ABC和遗产有用的信息。