Получить все модели детей из родительского класса - Джанго - PullRequest
0 голосов
/ 17 октября 2018

Как я могу получить все модели детей из родительского класса?В качестве примера у меня есть:

class Device(PolymorphicModel):
   .....

class Mobile(Device): 
   .....

class Computer(Device):
   .....

Поэтому я хочу получить из модели устройства всех его потомков: мобильные, компьютерные, а не классы как экземпляры.

Спасибо.

1 Ответ

0 голосов
/ 17 октября 2018

Вы можете получить прямой подкласс с помощью метода 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(), содержащий всех потомков (как прямых, так и косвенных).

...