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