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._meta._fields((( 中使用 "list(x.name for x "比 "del x" 更漂亮。请参阅上述关于生成器不泄漏其控制变量的 https://stackoverflow.com/a/4199355。
看看这里: https://docs.djangoproject.com/en/1.5/topics/db/models/#multi-table-inheritance
简而言之,您不需要将父字段应用于子字段(它们已经存在,但位于不同的表中(,您可以直接在 RebelliousChild 实例上访问它们。