【问题标题】:Can a django model have two abstract classes?django 模型可以有两个抽象类吗?
【发布时间】:2010-06-29 19:27:15
【问题描述】:

我有这个模型:

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

【问题讨论】:

    标签: django django-models abstract-class billing


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • +1 用于解释离散对象。但是,我还是有一个疑问,如果我创建一个Bill类,它可以是空的吗?我的意思是,没有字段,只从 ABC 继承?
    • 确实可以。你只需写 pass 在类下缩进。
    • 以下是该问题的文档以及如何操作的示例:docs.djangoproject.com/en/stable/topics/db/models/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2013-11-29
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多