Django Model Mixins:继承自models.Model还是来自对象?

时间:2010-07-15 09:57:11

标签: python

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

如果mixin从类中继承,它是否设计为与'object'混合使用?

代码示例,更正确或更好,或更好,取决于您想要实现的目标?

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)

我认为从对象继承是正确的方法。但我正在网上看到第一个案例的例子......

编辑:我已将我的跟进问题移至另一个问题:Django Abstract Models vs simple Python mixins vs Python ABCs

4 个答案:

答案 0 :(得分:64)

当谈到模型类时,Django会做很多元魔术,所以不幸的是,丹尼尔罗斯曼的回答 - 他们从object继承的 - 通常的mixin方法 - 不会在Django宇宙中工作得很好。

使用提供的示例构建mixins的正确方法是:

class TaggingMixin(models.Model):
    tag = models.ForeignKey(Tag)

    class Meta:
        abstract = True

class MyModel(TaggingMixin):
    title = models.CharField(max_length=100)

重点是:

  • Mixins继承自model.Model,但配置为抽象类。
  • 因为mixins继承自model.Model,所以您的实际模型应该继承它。如果这样做,这可能会触发一致的方法解析顺序异常。

答案 1 :(得分:15)

我建议它继承自object。这样,您可以确保它仅提供您实际明确定义的那些方法和属性。

此外,在定义具体类时,应始终确保将mixin类放在。 Python的解析规则意味着在类声明中按照它们的定义顺序搜索超类,并且当找到匹配的属性时,解析停止。因此,如果你的mixin定义了一个也由主超类定义的方法,那么你的mixin方法将无法找到。

答案 2 :(得分:6)

这看起来像是abstract model的作业。

修改

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

答案 3 :(得分:3)

当您从纯Python对象继承时,South不会创建迁移,因此您无法使用此方法