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

7 投票
3 回答
931 浏览
提问于 2025-04-17 05:05

我有一些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)

可以获取一个列表,这个列表描述了FooBar之间的继承关系。

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()

撰写回答