簡體   English   中英

為什么模型mixins破壞django-mptt外鍵?

[英]Why do model mixins break django-mptt foreign keys?

我正在修改基於django-mptt的第三方Django應用。 我試圖將一個巨大的模型重構為一個基類和一組mixins。 一切似乎都很好,但是...

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

class BaseModel(ModelMixin, MPTTModel):
    class Meta:
        abstract = False
  1. 如果ModelMixinobject繼承,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'

文檔

請注意,如果您使用的是多重繼承,則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錯誤; 沒有完整的追溯就很難說。 您可以添加其余的追溯上下文嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM