在Django模型中使用`issubclass()`

时间:2011-10-27 10:45:27

标签: python django django-models

我有一些Django模型,比如说

class Foo(models.Model):
    class Meta:
        abstract = True

class Bar(Foo)
    pass

我希望能够找到继承自Foo的所有模型,以便用它们执行任务。它应该很容易,比如

from django.db import models
from myapp.models import Foo

for model in models.get_models():
    if issubclass(model, Foo):
        do_something()

唉,这不起作用,因为issubclass(Bar, Foo)报告False,可能是因为初始化模型的Django元类的内部工作。

  

有没有办法检查Django模型是否是抽象Django模型的后代?

请不要建议鸭子打字作为解决方案。在这种情况下,我真的想知道是否存在子类关系。

3 个答案:

答案 0 :(得分:1)

问题是如何导入类。而不是:

from myapp.models import Foo

使用:

from myproject.myapp.models import Foo

要了解正确的方法,您可以看到Django如何导入模型:

print models.get_models()

答案 1 :(得分:0)

可能像

subclasses = Foo.__subclasses__()
for subclass in subclasses:
    # we need to keep looking for subclasses of the subclasses
    subclasses += subclass.__subclasses__()
# sometimes we don't care about abstract classes
concrete_subclasses = filter(lambda c: not c._meta.abstract, subclasses)

答案 2 :(得分:0)

使用

Bar._meta.get_base_chain(Foo)

获取描述FooBar之间的继承链的列表。