2011-10-12 48 views
2

我有一個模型類B和C,它實現了方法f並從模型類A繼承。 我想在所有A實例(B和C)上調用函數f, 。 爲什麼如何在django繼承模型中調用正確的方法

for a in A.objects.all(): 
    a.f() 

不按預期方式工作?

+0

什麼是預期behavi或者,你觀察到了什麼? –

+0

我預期對於每一個實例的方法F(B.f爲B,爲C.f C)。發生了什麼,它試圖調用A.f方法。 – Guy

回答

3

這是因爲默認的Django管理不管理的多態性。所以,當你做

for a in A.objects.all(): 
    … 

你所有的a對象是A型的,也沒有B型或C

您需要使用django-model-utils應用程序,這是select_subclasses工具:

for a in A.objects.select_subclasses(): 
    # type(a) returns the correct subclass 
0
for a in A.objects.all():  
    hasattr(a,'f') and callable(a.f) and a.f() 

所以首先檢查一下是否有'f'屬性,然後如果它是可調用的,最後調用它。

+0

即使A類實現的繼承類的方法F的方法F我想被調用。 – Guy