可以在Django抽象模型中使用多重继承吗?

Ben*_*rts 26 django django-models

我有三个不同的抽象模型基类...我想在多重继承中使用它们,有点像Mixins.这有什么问题吗?

例如,

class TaggableBase(models.Model):

. . .

    class Meta:
        abstract = True

class TimeStampedBase(models.Model):

. . .

    class Meta:
        abstract = True

class OrganizationalBase(models.Model):

. . .

    class Meta:
        abstract = True

class MyTimeStampedTaggableOrganizationalModel(OrganizationalBase, TimeStampedBase, TaggableBase):

. . . 
Run Code Online (Sandbox Code Playgroud)

Bru*_*tus 12

如果你使用任何领域在你的类,继承models.Model.

否则Django将忽略这些字段(Python中的属性仍然存在,但DB中不会创建任何字段).设置abstract = True为像行为一样获得"mixin"(即不会为mixin创建DB表,而是为使用这些mixin的模型创建).

如果你不使用任何字段,你可以继承object,保持简单明了.


Bra*_*don 11

我一直用我的类和模型类来做这件事.在我看来,这是Python中最好的东西之一.


Nic*_*win 6

听起来你正在尝试做什么,mixins真的是最合适的.一个简单的谷歌搜索会发现很多关于在python中实现mixins的文章,比如这个.我不确定多重继承是最好的方法,所以你可能想要探索所有其他选项.还有什么想到的?

  • 只需注意,上面的代码工作正常,这通常是我为模型实现"mixins"的方式,因此我不认为Nick的建议意味着我应该做任何不同的事情.事实上,如果你没有在每个Meta类中使用abstract = True并且没有每个mixin继承自models.Model,我不确定它是否会起作用.我在django中使用了多重继承,即mixins,并且在基于类的视图和模型中发现它是非常有用的方法,以保持DRY.只要确保你理解其含义,并且你的父类的顺序很重要. (7认同)
  • mixins与多重继承有何不同?他们似乎是同一件事,只是名字不同。 (3认同)