我有一个模型类B和C,它实现了一个方法f,并继承自模型类A. 我想在所有A实例(B和C)上调用函数f。 为什么
for a in A.objects.all():
a.f()
不按预期工作?
答案 0 :(得分: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
答案 1 :(得分:0)
for a in A.objects.all():
hasattr(a,'f') and callable(a.f) and a.f()
首先检查a是否具有'f'属性,然后检查它是否可调用并最终调用它。
答案 2 :(得分:0)
如果您的模型共享相同的数据(即您只需要自定义方法),您可以使用此处描述的代理技巧:http://anthony-tresontani.github.com/Python/2012/09/11/django-polymorphism/