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关于生成器不泄漏其控制变量的信息。