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的回答中建议的混合方法——它们从
使用提供的示例,构造混音器的正确方法是:
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 ,所以您的实际模型不应该继承自该模型。如果这样做,可能会触发一致的方法解析顺序异常。
小精灵
我建议它继承自
另外,在定义具体类时,应该始终确保将mixin类放在第一位。python的解析规则意味着按照类声明中的定义顺序搜索超类,找到匹配属性时解析停止。因此,如果您的mixin定义了一个同样由主超类定义的方法,则不会找到mixin方法。
这看起来像是抽象模型的工作。
编辑:
它们本身并不是混合体。或者更确切地说,他们不需要。可以直接从抽象模型派生。
当您从纯python对象继承时,south不会创建迁移,因此不能使用此方法