Мы можем реализовать решение для этого. Сначала мы можем сгенерировать набор подклассов абстрактной модели, например, с помощью этого решения :
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
Далее мы можем повторить это и каждый раз вызывать функцию, например:
for subclass in get_descendants(<i>AbstractModel</i>):
# ... do something with that subclass
pass
Где AbstactModel
- это абстрактная модель, из которой вы хотите получить подклассы.
Вы должны инициировать оценку этого при загрузке приложений, например, в методе ready()
[Django-doc] из AppConfig
.
Это очень редко, особенно для моделей, чтобы позже сделать новый подкласс. Для моделей, которые были бы весьма необычными и в любом случае не очень хорошими, поскольку, скорее всего, это не сработает, если вы захотите выполнить миграцию.
Пример : добавление сигнала к каждому подклассу
Например, мы можем добавить сигнал к каждому подклассу AbstractModel
, сначала определив обработчик сигнала:
def test_signal(sender, instance, **kwargs):
print('{} is saved'.format(instance))
и затем мы можем связать его с каждым подклассом:
from django.db.models.signals import <b>post_save</b>
for subclass in get_descendants(<i>AbstractModel</i>):
<b>post_save.connect(</b>test_signal, sender=subclass<b>)</b>