【问题标题】:Why do model mixins break django-mptt foreign keys?为什么模型混合会破坏 django-mptt 外键?
【发布时间】:2014-01-17 17:03:30
【问题描述】:

我正在修改一个基于 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-aware模型的额外字段会被添加两次; 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'

【问题讨论】:

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


    【解决方案1】:

    来自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,则这些字段将不起作用,因为它们不会得到 ModelBase 元类调用的 contribute_to_class 方法。

    您在案例 3 中显示的错误可能是 Django 错误;没有完整的追溯很难说。你能添加其余的回溯上下文吗?

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2015-03-25
      • 1970-01-01
      相关资源
      最近更新 更多