Получение модели из нескольких приложений одновременно с помощью apps.get_model

Я создаю API, который может получить доступ к нескольким приложениям в одном проекте и получить модель из всех этих приложений

для этого я попробовал следующее:

def get(self, request, **kwargs):
    m = request.GET['model']
    depth = request.GET['depth']
    print("model")
    model = apps.get_model('masters', str(m))
    obj1 = model.objects.all()

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

    model = apps.get_model(['masters','dockets'], str(m))

но получил ошибку TypeError: unhashable type: 'list'. apps.get_model не принимает список, но есть ли какой-нибудь обходной путь для этого?

Как можно увидеть в официальной документации, ссылка на которую находится здесь https://docs.djangoproject.com/en/4.1/ref/applications/#django.apps.apps.get_model,

Метод

apps.get_model(app_label, model_name, require_ready=True) принимает 3 аргумента, где app_label и model_name - строки, а require_ready - необязательный булев. Следовательно, при попытке передать список для аргумента app_label вы получите ошибку.

Если у вас всего 2 или 3 приложения, простым вариантом для вас будет использование try except, как это,

try:
    model = apps.get_model("masters", str(m))
except LookupError:
    model = apps.get_model("dockets", str(m))

Однако это явно нецелесообразно, если вы имеете дело с большим количеством приложений.

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

def get(self, request, **kwargs):
    model_name = request.GET['model']
    app_label = request.GET['app_label'] # app label also as part of request
    depth = request.GET['depth']
    print("model_name")
    model = apps.get_model(str(app_label), str(m))
    obj1 = model.objects.all()

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

Вернуться на верх