从父类获取所有子模型 - Django

5

如何从父类获取所有子模型?例如:

class Device(PolymorphicModel):
   .....

class Mobile(Device): 
   .....

class Computer(Device):
   .....

我想从设备模型中获取其所有后代:Mobile,Computer作为类而不是实例。

谢谢。

1个回答

6
你可以使用class.__subclasses__() [Python-doc]方法来获取直接的子类:
>>> Device.__subclasses__()
[<class 'Mobile'>, <class 'Computer'>]

这些可能也有子类。我们可以开发一个算法,每次获取下一代,并持续进行此操作,直到找不到新的子类为止,就像这样:
def get_descendants(klass):
    gen = { klass }
    desc = set()
    while gen:
        gen = { skls for kls in gen for skls in kls.__subclasses__() }
        desc.update(gen)
    return desc

或者使用可变数量的参数:
def get_descendants(*klass):
    gen = { *klass }
    desc = set()
    while gen:
        gen = { skls for kls in gen for skls in kls.__subclasses__() }
        desc.update(gen)
    return desc

这将返回一个包含所有后代(直接和间接)的set()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接