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

4

1 回答 1

2

看看这里:https ://docs.djangoproject.com/en/1.5/topics/db/models/#multi-table-inheritance

简而言之,您不需要将父字段应用于子字段(它们已经存在,但在不同的表中),您可以直接在 RebelliousChild 实例上访问它们。

于 2013-08-18T08:50:49.020 回答