django模型可以有两个抽象类吗?

时间:2010-06-29 19:27:16

标签: django django-models abstract-class billing

我有这个型号:

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

BillDataBillFooter对于每个BillHeader都是通用的,因此我将其标记为abstract。我能做class BillHeader(BillData, BillFooter)还是我做错了什么?

我还考虑过做主BillDataBillHeader BillFooter摘要。我没有任何做数据模型的经验(至少不是复杂的模型)而且我有点迷失。你会推荐什么?

1 个答案:

答案 0 :(得分:8)

是的,Django模型可以从任意数量的抽象基类继承,只要它们不会导致模糊的“模型解析顺序”。将继承视为一个链......您继承的每个类都是链中的一个链接。继承两个基类只是添加两个链接到链而不是一个。

换句话说,如果您的抽象基类继承自models.Model,那么不要尝试继承{{1>}中的抽象基类 models.Model。 1}}类。 Bill已经在继承链中,因此继承它会导致基类链中的混乱。

至于 I 将如何构建这些类,我将创建一个名为models.Model的模型,该模型继承自BillBillHeader和{{1} }。原因是我喜欢我的Django模型来表示离散对象(例如Bill,Article,BlogPost,Photo等)。

然而,抽象基类的要点是能够为公共字段和方法添加抽象级别,以便多个类可以从它们继承。如果你只是创建一个比尔类,它有点无意义。但是,如果你有Bill,UnpaidBill和PaidBill ......所有这些都会有共同字段出现在所有这些字段上,你可以通过抽象到ABC来节省很多麻烦。

希望能够提供一些有关ABC和遗产有用的信息。

相关问题