5

我有这个模型:

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抽象的。我在做数据模型方面没有任何经验(至少不是复杂的),我有点迷茫。你会推荐什么?

4

1 回答 1

9

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

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

至于如何构建这些类,将创建一个模型Bill,称为继承自BillHeaderBillDataBillFooter. 这样做的原因是我喜欢我的 Django 模型来表示离散对象(例如 Bill、Article、BlogPost、Photo 等)

但是,抽象基类的重点是能够为公共字段和方法添加一个抽象级别,以便多个类可以从它们继承。如果您只是创建一个 Bill 类,那么它有点毫无意义。但是,如果您有 Bill、UnpaidBill 和 PaidBill……所有这些都应该有共同的字段,应该出现在所有这些字段上,您可以通过抽象为 ABC 来为自己省去很多麻烦。

希望这提供了一些关于 ABC 和继承的好处的见解。

于 2010-06-29T20:07:32.840 回答