2016-11-09 3 views
1

私は親クラス(チャンク)内のすべてのオブジェクトをソートして最も高い優先度のオブジェクトを取得する関数get_priority()を持っています。今私は関連するサブクラスオブジェクトをスーパークラスオブジェクトに取得したいと思います。Django - MTIを使用して親クラスオブジェクトから子タイプのオブジェクトを取得するにはどうすればよいですか?

Django docs on Multi-Table Inheritanceは、サブクラスの小文字の名前を使用してこれを行うことができます。サブクラスがコンセプトだった場合たとえば、私は次のことを行うことができます:

chunk = get_priority(Chunk.objects.all()) 
chunk.concept 

はしかし、サブクラスは概念、コード、式または問題である可能性があります。各サブクラスにtry/exceptを使用するには、これにアプローチする唯一の方法です(例:

)。
chunk = get_priority(Chunk.objects.all()) 
    try: 
     object = chunk.concept 
    except: 
     pass 
    try: 
     object = chunk.code 
    except: 
     pass 
    # etc. 

答えて

1

私はそれがどのような子供か、少なくとも最も単純なものかを確認する最良の方法ではないと思います。

私はあなたが私はこれを行うだろう正しい子を取得するには、(管理オブジェクト個人的に私はチャンクの上に置く)get_priority()上のチャンクの優先度を得るためにあなたのカスタムメソッドを持っていると思います。で

chunk = get_priority(Chunk.objects.all()) 

object = None 
for attr in ('concept', 'code', 'formula', 'problem'): 
    if hasattr(chunk, attr): 
     object = getattr(chunk, attr) 

最後にobject変数に子を持つか、子がない場合はNoneになります。子供が見つからない場合は例外をスローするようにobjectの結果を再生できます。pass

0

チャンクオブジェクトに優先度属性があると推定します。これがtrueの場合 は、チャンクのクエリセットをソートするためにあなたが使用する必要があります。Specifying the parent link field

Chunk.objects.order_by('-priority') 

そして、質問自体に参照のうえでは、に見てみましょう。すべてのサブクラスに対して同じ参照名を設定できます。

Futhermore私はACOUNTにジャンゴの2つのスコープの助言を取るためにあなたをアドバイスします:

時々「具体的なinherance」と呼ばれる

マルチテーブルinheranceが、あることを著者や他の多くの開発者によって考えられています悪いこと。私たちはそれを使用することを強くお勧めします。

関連する問題