在Django模型中使用`issubclass()`
我有一些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
使用
Bar._meta.get_base_chain(Foo)
可以获取一个列表,这个列表描述了Foo
和Bar
之间的继承关系。
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
问题在于你是怎么导入这些类的。不要这样做:
from myapp.models import Foo
而是要这样:
from myproject.myapp.models import Foo
想要了解正确的做法,你可以看看Django是怎么导入你的模型的,使用的是:
print models.get_models()