0

我正在修改基于 django-mptt 的第三方 Django 应用程序。我正在尝试将一个巨大的模型重构为一个基类和一组 mixin。一切似乎都很好,然而......

class ModelMixin([see below]):
    class Meta:
        abstract = True

class BaseModel(ModelMixin, MPTTModel):
    class Meta:
        abstract = False
  1. 如果ModelMixin继承自object, South 看不到 mixin 中声明的任何字段。
  2. 如果ModelMixin继承自mptt.models.MPTTModel,则 django-mptt 添加到 MPTT 感知模型的额外字段将添加两次;这django-mptt不喜欢,即使 mixin 是抽象的。
  3. 最有趣的是,如果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'
4

1 回答 1

4

文档

请注意,如果您使用多继承,则 MPTTModel 通常应该是第一个要继承的类

这并不能完全解释您所看到的行为,但如果您还让您的 mixin 从models.Model. IE:

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 错误;没有完整的追溯很难说。你能添加其余的回溯上下文吗?

于 2014-01-19T22:06:04.137 回答