Как правильно получить все определения классов, содержащие конкретную примесь c? - PullRequest
2 голосов
/ 29 мая 2020

Я работаю над приложением django и хочу создать миксин, который всегда будет применяться к определениям модели. Функциональность, добавленная миксином, не важна для вопроса.

Однако мне нужно иметь возможность получить список всех определений классов, которые наследуются от этого миксина. Эти классы могут находиться в разных приложениях в рамках проекта django.

Возможные ответы, которые я нашел до сих пор:

Как найти все подклассы класса с учетом его name?

Как автоматически зарегистрировать класс, если он определен

Мне в основном интересно, какой метод лучше всего достичь sh этой цели .

1 Ответ

1 голос
/ 29 мая 2020

Обычно вы можете получить список всех классов, наследующих конкретный класс, путем регистрации классов с помощью метакласса (как объясняется в одном из вопросов, которые вы связали). Однако модели Django используют свой собственный мета-класс для достижения большей части того, что они делают автоматически. Я бы не рекомендовал добавлять еще один мета-класс в этот микс - здесь все может go неправильно !!

К счастью, в django есть нечто, называемое структура типов содержимого , которая по сути, это реестр всех ваших моделей в конкретном проекте.

Чтобы получить список всех ваших моделей, вы можете сделать это:

from django.contrib.contenttypes.models import ContentType

content_types = ContentType.objects.all()

Это не будет модели, а скорее набор запросов из ContentType экземпляров. Чтобы затем получить из этого классы моделей, вы можете сделать

models = [x.model_class() for x in content_types]

Итак, теперь у нас есть список моделей. Затем мы можем просто отфильтровать список до тех моделей, которые наследуют ваш миксин:

models_with_mixin = [x for x in models if issubclass(x, MyMixin)]

Мы можем упростить все вышеперечисленное до следующего:

from django.contrib.contenttypes.models import ContentType

models_with_mixin = [
    x.model_class()
    for x in ContentType.objects.all()
    if issubclass(x.model_class(), MyMixin)
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...