如何在django继承模型中调用正确的方法
问题描述:
我有一个模型类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'属性,然后如果它是可调用的,最后调用它。
+0
即使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