Почему примеси моделей ломают внешние ключи django-mptt?

Я изменяю стороннее приложение Django на основе django-mptt. Я пытаюсь преобразовать одну чудовищно большую модель в базовый класс и набор примесей. Все вроде бы хорошо, однако...

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

class BaseModel(ModelMixin, MPTTModel):
    class Meta:
        abstract = False
  1. Если ModelMixin наследуется от object, South не видит никаких полей, объявленных в примеси.
  2. Если ModelMixin наследуется от mptt.models.MPTTModel, дополнительные поля, которые django-mptt добавляет в модели с поддержкой MPTT, добавляются дважды; что django-mptt не нравится, несмотря на то, что миксин абстрактный.
  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'

person avramov    schedule 17.01.2014    source источник


Ответы (1)


Из документов:

Обратите внимание, что если вы используете множественное наследование, MPTTModel обычно должен быть первым классом, наследуемым от

Это не совсем объясняет поведение, которое вы наблюдаете, но, вероятно, это поможет обойти ошибку, если вы также сделаете свой миксин производным от models.Model. то есть:

class ModelMixin(models.Model):
    class Meta:
        abstract = True

class BaseModel(MPTTModel, ModelMixin):
    class Meta:
        abstract = False

Примесь определенно должна происходить от models.Model; поля не будут работать, если они просто являются подклассами object, потому что они не получат свой метод contribute_to_class, вызываемый метаклассом ModelBase.

Ошибка, которую вы показали в случае 3, может быть ошибкой Django; трудно сказать без полной трассировки. Не могли бы вы добавить остальную часть контекста трассировки?

person craigds    schedule 19.01.2014