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

Gui*_*rat 4 python django django-models

我如何从家长班获得所有孩子的模特儿?例如,我有:

class Device(PolymorphicModel):
   .....

class Mobile(Device): 
   .....

class Computer(Device):
   .....
Run Code Online (Sandbox Code Playgroud)

因此,我想从Device模型中获取所有后代:移动设备,计算机作为类而不是实例。

谢谢。

Wil*_*sem 5

您可以使用[Python-doc]方法获取直接子类:class.__subclasses__()

>>> Device.__subclasses__()
[<class 'Mobile'>, <class 'Computer'>]
Run Code Online (Sandbox Code Playgroud)

但是,这些也可能具有子类。我们可以开发一种算法,每次获得下一代算法,并一直这样做直到找到新的子类为止,例如:

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
Run Code Online (Sandbox Code Playgroud)

或具有可变数量的参数:

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
Run Code Online (Sandbox Code Playgroud)

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