문제

class Parent(models.Model):
    pass

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

Django 1.3 responds:

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

Django 1.5 responds:

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

My second reaction (after trying to make the variable private) was to delete the variable (which worked.)

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

List comprehensions leak their control variables in Python 2. Django prohibits overriding parent field attributes, which seems to be involved somehow, since Django 1.5 has the same issue. But in both cases the leaked attribute name _RebelliousChild__x isn't defined on Parent.

What is going on here?

PS Using "list(x.name for x in Parent._meta._fields())" is prettier than "del x". See the aforementioned https://stackoverflow.com/a/4199355 about generators not leaking their control variables.

도움이 되었습니까?

해결책

Have a look here: https://docs.djangoproject.com/en/1.5/topics/db/models/#multi-table-inheritance

In short, you don't need to apply the parent fields to the child(they already exist, but in a different table), you can access them directly on a RebelliousChild instance.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top