親クラスと親クラスを継承する子クラスがあります。子クラスオブジェクトでは、親クラスフィールドと子クラスフィールドを区別する必要があります。親クラスフィールドの検出方法
この情報は有効ですか?そうなら、どこに。 Python、特にDjangoで解決策が必要です。
親クラスと親クラスを継承する子クラスがあります。子クラスオブジェクトでは、親クラスフィールドと子クラスフィールドを区別する必要があります。親クラスフィールドの検出方法
この情報は有効ですか?そうなら、どこに。 Python、特にDjangoで解決策が必要です。
は、親と子のモデルを考えてみましょう:
class Parent(models.Model):
parent_field = models.CharField(max_length=100)
class Child(Parent):
child_field = models.CharField(max_length=100)
フィールドは親のいずれかで定義されている場合、我々はclass.__bases__
を反復処理し、各
baseclass._meta.get_field
を試してみてください決定する関数を作成するには今
def is_attr_defined_on_parent(child, attr):
for parent in child.__bases__:
try:
parent._meta.get_field(attr)
except models.FieldDoesNotExist:
continue
else:
return True
return False
:
is_attr_defined_on_parent(Child, 'parent_field')
の戻り真、
is_attr_defined_on_parent(Child, 'child_field')
戻り偽。
まず、これを行う必要があるデザインを避けてください。おそらく別の親オブジェクトを取得する必要がありますか?
ただし、これは、任意のdjangoモデルインスタンスの._meta.fields
プロパティを調べることで実行できます。
._meta.fieldsには親を含むすべてのフィールドが含まれています。どのようにフィールドが来ているかを把握する方法。 – jerrymouse
はい、親を調べてから、2つのセットの差を取ることができます。 – Marcin
'スーパー()'は何ですか? [詳細はこちら](http://docs.python.org/library/functions.html#super) – deinonychusaur
@deinonychusaur私はすでに知っている親クラスのメソッドを呼び出すためにsuper()を使うことができます。ここでは、フィールドが子または親に属しているかどうかを知る必要があります。 – jerrymouse
それではChildClass .__ mro __ [1] __。PatentClass.fieldを指すフィールド – deinonychusaur