我有一個模型類B和C,它實現了方法f並從模型類A繼承。 我想在所有A實例(B和C)上調用函數f, 。 爲什麼如何在django繼承模型中調用正確的方法
for a in A.objects.all():
a.f()
不按預期方式工作?
我有一個模型類B和C,它實現了方法f並從模型類A繼承。 我想在所有A實例(B和C)上調用函數f, 。 爲什麼如何在django繼承模型中調用正確的方法
for a in A.objects.all():
a.f()
不按預期方式工作?
這是因爲默認的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
for a in A.objects.all():
hasattr(a,'f') and callable(a.f) and a.f()
所以首先檢查一下是否有'f'屬性,然後如果它是可調用的,最後調用它。
即使A類實現的繼承類的方法F的方法F我想被調用。 – Guy
如果你的模型共享方式相同的數據(例如,你只需要自定義方法),您可以使用代理伎倆在這裏描述:http://anthony-tresontani.github.com/Python/2012/09/11/django-polymorphism/
什麼是預期behavi或者,你觀察到了什麼? –
我預期對於每一個實例的方法F(B.f爲B,爲C.f C)。發生了什麼,它試圖調用A.f方法。 – Guy