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

时间:2011-10-12 09:02:18

标签: python django oop

我有一个模型类B和C,它实现了一个方法f,并继承自模型类A. 我想在所有A实例(B和C)上调用函数f。 为什么

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

不按预期工作?

3 个答案:

答案 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/