2012-03-20 9 views
1

親クラスと親クラスを継承する子クラスがあります。子クラスオブジェクトでは、親クラスフィールドと子クラスフィールドを区別する必要があります。親クラスフィールドの検出方法

この情報は有効ですか?そうなら、どこに。 Python、特にDjangoで解決策が必要です。

+0

'スーパー()'は何ですか? [詳細はこちら](http://docs.python.org/library/functions.html#super) – deinonychusaur

+0

@deinonychusaur私はすでに知っている親クラスのメソッドを呼び出すためにsuper()を使うことができます。ここでは、フィールドが子または親に属しているかどうかを知る必要があります。 – jerrymouse

+0

それではChildClass .__ mro __ [1] __。PatentClass.fieldを指すフィールド – deinonychusaur

答えて

1

は、親と子のモデルを考えてみましょう:

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 

  1. is_attr_defined_on_parent(Child, 'parent_field')の戻り

  2. is_attr_defined_on_parent(Child, 'child_field')戻り

2

まず、これを行う必要があるデザインを避けてください。おそらく別の親オブジェクトを取得する必要がありますか?

ただし、これは、任意のdjangoモデルインスタンスの._meta.fieldsプロパティを調べることで実行できます。

+0

._meta.fieldsには親を含むすべてのフィールドが含まれています。どのようにフィールドが来ているかを把握する方法。 – jerrymouse

+0

はい、親を調べてから、2つのセットの差を取ることができます。 – Marcin

関連する問題