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

And*_*rea 6 python django django-models

我说有一些Django模型

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

class Bar(Foo)
    pass
Run Code Online (Sandbox Code Playgroud)

我希望能够找到继承自Foo的所有模型,以便用它们执行任务.它应该很简单,就像

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

for model in models.get_models():
    if issubclass(model, Foo):
        do_something()
Run Code Online (Sandbox Code Playgroud)

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

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

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

sec*_*ond 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)
Run Code Online (Sandbox Code Playgroud)