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'
私の2番目の反応(変数をプライベートにしようとした後)は、変数を削除することでした(これは機能しました)。
parent_fields = [__x.name for __x in Parent._meta._fields()]
del __x
Python 2 では、リスト内包表記が制御変数をリークします。Django 1.5 にも同じ問題があるため、Django は親フィールド属性のオーバーライドを禁止しています。ただし、どちらの場合も、漏れた属性名_RebelliousChild__x
は親で定義されていません。
ここで何が起こっているのですか?
PS "list(x.name for x in Parent._meta._fields())" を使用すると、"del x" よりもきれいになります。ジェネレーターが制御変数をリークしないことについては、前述のhttps://stackoverflow.com/a/4199355を参照してください。