如何通过apps.get_model从多个Django应用中获取模型?
解决办法
apps.get_model() 方法的第一个参数仅接受单个应用名称字符串,无法直接传入列表,这就是你触发TypeError: unhashable type: 'list'错误的原因。以下是针对多应用模型获取需求的可行方案:
方案一:遍历应用列表批量获取同名称模型
如果目标应用下需要获取的模型名称一致(比如都叫TargetModel),可以通过循环遍历应用列表逐个获取:
from django.apps import apps app_list = ['masters', 'dockets'] target_model_name = 'TargetModel' collected_models = [] for app_label in app_list: try: model = apps.get_model(app_label=app_label, model_name=target_model_name) collected_models.append(model) except LookupError: # 处理应用中不存在目标模型的异常情况 print(f"应用 {app_label} 未找到模型 {target_model_name}")
方案二:按应用-模型映射关系获取不同模型
如果不同应用需要获取的模型名称不同,可以用字典存储对应关系后遍历处理:
from django.apps import apps app_model_mapping = { 'masters': 'MasterDataModel', 'dockets': 'DocketRecordModel' } collected_models = {} for app_label, model_name in app_model_mapping.items(): try: model = apps.get_model(app_label=app_label, model_name=model_name) collected_models[app_label] = model except LookupError: print(f"应用 {app_label} 未找到模型 {model_name}")
关键说明
apps.get_model()内部会通过app_label哈希查找对应应用配置,而列表属于不可哈希类型,因此直接传入列表会报错。- 加入
try-except捕获LookupError,可以避免单个应用/模型不存在导致整个流程中断,提升代码健壮性。
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

