为什么模型mixin打破django-mptt外键?

时间:2014-01-17 17:03:31

标签: python django django-models django-mptt mptt

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

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

class BaseModel(ModelMixin, MPTTModel):
    class Meta:
        abstract = False
  1. 如果ModelMixin继承自object,则南方看不到混合中声明的任何字段。
  2. 如果ModelMixin继承自mptt.models.MPTTModel,则django-mptt添加到MPTT感知模型的额外字段会被添加两次;哪个django-mptt不喜欢,即使mixin是抽象的。
  3. 最有趣的是,如果ModelMixin继承自django.db.models.Model,当我尝试向该模型引入外键时,我会遇到这种血腥奇怪的错误:
  4. 回溯:

    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'
    

1 个答案:

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