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

Django Model Mixins: inherit from models.Model or from object?

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

mix in应该继承它设计用来与"object"混合的类吗?

代码示例:根据您想要实现的目标,什么更正确、更好或更好?

这个

1
2
3
4
5
6
7
8
class TaggingMixin(models.Model):
    tag = models.ForeignKey(Tag)

    class Meta:
        abstract = True

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

或者这个:

1
2
3
4
5
6
7
8
class TaggingMixin(object):
    tag = models.ForeignKey(Tag)

    class Meta:
        abstract = True

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

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

编辑:我把后续问题转移到了一个单独的问题上:django抽象模型vs简单的python mixins vs python abcs


在模型类方面,Django做了很多元魔法,因此不幸的是,Daniel Roseman的回答中建议的混合方法——它们从object继承而来——在Django宇宙中并没有很好地工作。

使用提供的示例,构造混音器的正确方法是:

1
2
3
4
5
6
7
8
class TaggingMixin(models.Model):
    tag = models.ForeignKey(Tag)

    class Meta:
        abstract = True

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

这里的要点是:

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


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

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


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

    编辑:

    它们本身并不是混合体。或者更确切地说,他们不需要。可以直接从抽象模型派生。


    当您从纯python对象继承时,south不会创建迁移,因此不能使用此方法