代码之家  ›  专栏  ›  技术社区  ›  CastleDweller

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

  •  3
  • CastleDweller  · 技术社区  · 16 年前

    我有这种型号:

    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) 或者我做错了什么?

    我也想过做 比尔数据 主要的一个,和 报头 比尔沃特 摘要。我没有做数据模型的经验(至少不是复杂的),我有点迷路了。你会推荐什么?

    1 回复  |  直到 16 年前
        1
  •  8
  •   Gabriel Hurley    16 年前

    是的,Django模型可以继承任意多个抽象基类,只要它们不会导致模棱两可的“模型解析顺序”。把继承看作是一条链条…从中继承的每个类都是链中的一个链接。从两个基类继承只是向链添加两个链接,而不是一个。

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

    至于如何 将构造这些类,我将创建一个名为 比尔 继承自 BillHeader , BillData BillFooter . 原因是我喜欢我的django模型来表示离散的对象(例如,bill、article、blogpost、photo等)。

    然而,抽象基类的要点是能够向公共字段和方法添加一个抽象级别,以便多个类可以从中继承。如果你只是创建一个账单类,那就没有意义了。但是,如果你有比尔,不受资助,而且会……所有这些字段都应该出现在所有这些字段上,通过抽象到ABC,您可以省去很多麻烦。

    希望这能让我们对ABC和继承的好处有一点了解。