django 使用apps.get_model一次从多个应用程序获取模型

dgtucam1  于 2022-12-20  发布在  Go
关注(0)|答案(1)|浏览(144)

我正在创建一个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不接受列表,但是否有任何变通方案?

pcrecxhr

pcrecxhr1#

如可在官方文档参考中看到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:
    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()

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

相关问题