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'

私の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を参照してください。

4

1 に答える 1

2

こちらをご覧ください: https://docs.djangoproject.com/en/1.5/topics/db/models/#multi-table-inheritance

つまり、親フィールドを子に適用する必要はありません (既に存在しますが、別のテーブルにあります)。RebelliousChild インスタンスで直接アクセスできます。

于 2013-08-18T08:50:49.020 に答える