使用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'。应用程序。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_labelmodel_name是字符串,require_ready是可选的布尔值。因此,当您试图为app_label参数传递列表时,您会得到一个错误。

如果你只有2或3个应用程序,一个简单的选择是使用try,除了像这样,

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()

否则,我建议你创建一种注册表,其中包含可能在这里访问的来自不同应用程序的所有模型,然后从该注册表中获取模型。

最新更新