Многотабличное наследование Django подавляет утечку переменной в определении модели

class Parent(models.Model):
    pass

class RebelliousChild(Parent):
    parent_fields = [__x.name for __x in Parent._meta._fields()]

Django 1.3 отвечает:

django.core.exceptions.FieldError: Local field '_RebelliousChild__x' 
in class 'RebelliousChild'clashes with field of similar name from base class 'Parent'

Django 1.5 отвечает:

FieldError: Local field u'id' in class 'RebelliousChild' clashes with field 
of similar name from base class 'Parent'

Моей второй реакцией (после попытки сделать переменную частной) было удаление переменной (что сработало).

parent_fields = [__x.name for __x in Parent._meta._fields()]
del __x

Включение списков пропускает свои управляющие переменные в Python 2. Django запрещает переопределение родительского поля атрибуты, которые, кажется, каким-то образом задействованы, так как Django 1.5 имеет ту же проблему. Но в обоих случаях имя просочившегося атрибута _RebelliousChild__x не определено в Parent.

Что здесь происходит?

PS Использование «list(x.name for x in Parent._meta._fields())» красивее, чем «del x». См. Вышеупомянутый https://stackoverflow.com/a/4199355 о генераторах, не пропускающих свои управляющие переменные.


person Salticus    schedule 18.08.2013    source источник


Ответы (1)


Посмотрите здесь: https://docs.djangoproject.com/en/1.5/topics/db/models/#multi-table-inheritance

Короче говоря, вам не нужно применять родительские поля к дочернему (они уже существуют, но в другой таблице), вы можете получить к ним доступ непосредственно в экземпляре RebelliousChild.

person Roman Labunsky    schedule 18.08.2013