我有一些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模型的后代?
请不要建议鸭子打字作为解决方案。在这种情况下,我真的想知道是否存在子类关系。
答案 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)
获取描述Foo
和Bar
之间的继承链的列表。