Django模型Mixins:从models.Modelinheritance还是从对象inheritance?

这是一个关于Python Mixins的问题,一般来说可能是有用的。 我只是使用Django模型,因为这是我最熟悉的用例。

如果一个mixininheritance了它的目的,就是为了与“对象”混合或者从“对象”中混入?

代码示例,什么更正确或更好,或更好取决于你想实现什么?

这个

class TaggingMixin(models.Model): tag = models.ForeignKey(Tag) class Meta: abstract = True class MyModel(models.Model, TaggingMixin): title = models.CharField(max_length=100) 

或这个:

 class TaggingMixin(object): tag = models.ForeignKey(Tag) class Meta: abstract = True class MyModel(models.Model, TaggingMixin): title = models.CharField(max_length=100) 

我认为从客体inheritance是正确的。 但我看到所有networking上的第一个案件的例子…

编辑:我已经把我的后续问题提出了一个单独的问题: Django抽象模型与简单的Python mixins与Python ABCs

Django在模型类中做了很多元魔法,不幸的是,Daniel Roseman的答案(他们从objectinheritance而来)中mixin的常用方法在Django的Universe中并不适用。

使用提供的示例来构build混合的正确方法是:

 class TaggingMixin(models.Model): tag = models.ForeignKey(Tag) class Meta: abstract = True class MyModel(TaggingMixin): title = models.CharField(max_length=100) 

重要的一点是:

  • Mixin从model.Modelinheritance,但是被configuration为一个抽象类。
  • 因为mixin从model.Modelinheritance,你的实际模型不应该从它inheritance。 如果这样做,这可能会触发一致的方法parsing顺序例外。

我会build议它从objectinheritance。 这样你可以确保它只提供你明确定义的那些方法和属性。

另外,您应该始终确保在定义具体类时, 先将 mixin类放在第一位 。 Python的parsing规则意味着超类在类声明中按照其定义的顺序进行search,并且在find匹配属性时parsing停止。 所以如果你的mixin定义了一个也是由主超类定义的方法,你的mixin方法将不会被find。

这看起来像一个抽象模型的工作 。

编辑:

这些不是mixin本身。 或者说,他们不需要。 你可以直接从一个抽象模型派生。

当你从普通的Python对象inheritance时,南不会创build一个迁移,所以你不能使用这种方法