我正在修改基于django-mptt的第三方Django应用程序。我正在尝试将一个怪异的大型模型重构为基类和一组mixins。然而,一切似乎都很好......
class ModelMixin([see below]):
class Meta:
abstract = True
class BaseModel(ModelMixin, MPTTModel):
class Meta:
abstract = False
ModelMixin
继承自object
,则南方看不到混合中声明的任何字段。ModelMixin
继承自mptt.models.MPTTModel
,则django-mptt添加到MPTT感知模型的额外字段会被添加两次;哪个django-mptt
不喜欢,即使mixin是抽象的。ModelMixin
继承自django.db.models.Model
,当我尝试向该模型引入外键时,我会遇到这种血腥奇怪的错误:回溯:
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py"
line 900, in set_field_name
self.field_name = self.field_name or self.to._meta.pk.name
AttributeError: 'NoneType' object has no attribute 'name'
答案 0 :(得分:3)
来自the docs:
请注意,如果您使用多重继承,MPTTModel通常应该是第一个继承的类
这并没有完全解释你所看到的行为,但如果你也使你的mixin派生自models.Model
,它可能会解决这个问题。即:
class ModelMixin(models.Model):
class Meta:
abstract = True
class BaseModel(MPTTModel, ModelMixin):
class Meta:
abstract = False
mixin绝对应来自models.Model
;如果字段仅仅是object
的子类,则这些字段将无法工作,因为它们不会获得contribute_to_class
元类调用的ModelBase
方法。
您在案例3中显示的错误可能是Django错误;如果没有完整的追溯,很难说清楚。你能添加其余的追溯上下文吗?