如何在django继承模型中调用正确的方法

问题描述:

我有一个模型类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

这是因为默认的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'属性,然后如果它是可调用的,最后调用它。

+0

即使A类实现的继承类的方法F的方法F我想被调用。 – Guy

如果你的模型共享方式相同的数据(例如,你只需要自定义方法),您可以使用代理伎俩在这里描述:http://anthony-tresontani.github.com/Python/2012/09/11/django-polymorphism/