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

Osc*_*lal 3 django abstract-class billing django-models

我有这个型号:

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
Run Code Online (Sandbox Code Playgroud)

BillData并且BillFooter是共同的每BillHeader所以我将其标记为abstract.我能做什么class BillHeader(BillData, BillFooter)或者我做错了什么?

我也想过做BillData主要的,BillHeader BillFooter抽象的.我没有任何做数据模型的经验(至少不是复杂的模型)而且我有点迷失.你会推荐什么?

Gab*_*ley 8

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

换句话说,如果你的抽象基类继承models.Model,那么不要尝试从两个抽象基类继承,并 models.Model在你的Bill班级.models.Model已经在继承链中,因此继承它会导致基类链中的混乱.

至于如何将构建这些类,我会创建一个名为模型Bill,从继承BillHeader,BillDataBillFooter.原因是我喜欢我的Django模型来表示离散对象(例如Bill,Article,BlogPost,Photo等)

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

希望这能为ABC和遗产的优点提供一点见解.