Django Model Mixins:从models.Model继承还是从object继承?

2024-04-27 02:40:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

mix in应该继承它设计用来与“object”混合的类还是从“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


Tags: djangoabstracttruemodelobjecttitlemodelstag
3条回答

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

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

Django在其模型类方面做了很多元魔术,因此不幸的是,Daniel Roseman的答案中建议的通常的混合方法(它们从object继承)在Django宇宙中不起作用。

使用提供的示例构造mixin的正确方法是:

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

    class Meta:
        abstract = True

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

这里的要点是:

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

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

编辑:

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

相关问题 更多 >