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 о генераторах, не пропускающих свои управляющие переменные.