2016-11-09 72 views
1

我有一個函數get_priority(),它通過父類(塊)中的所有對象進行排序以獲得最高的「優先級」對象。現在我想要將相關的子類對象轉換爲超類對象。Django - 如何從使用MTI的父類對象獲取子類型對象?

Django docs on Multi-Table Inheritance表明我可以通過使用子類的小寫名稱來完成此操作。例如,如果子類是概念,我可以做到以下幾點:

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

然而,子類可以是概念,代碼,公式或問題。是唯一的方法來使用嘗試/除了每個子類,例如:

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

我推斷出Chunk對象有一個優先級屬性。 如果這是真的,排序大塊的查詢集,你應該使用:

Chunk.objects.order_by('-priority') 

而且指的這個問題本身,看看到:Specifying the parent link field。您可以爲所有小類設置相同的參考名稱。

Futhermore我會建議你考慮到acount Django中的兩個作用域的建議:

多表inherance,有時也被稱爲「具體inherance」是由作者和許多其他開發商認爲是壞事。我們強烈建議不要使用它。

相關問題