Django跨应用模型导入报错:ValueError相对导入超出顶级包
解决Django跨应用导入模型的相对导入错误
你碰到的这个ValueError是因为Django项目里的每个应用都是顶级Python包,没法用..这类相对导入语法跨应用拉取模型。下面给你几个靠谱的解决思路:
方法1:绝对导入(官方推荐)
直接从目标应用的名称开始导入,这是最规范也最不容易出问题的方式:
# 导入packsapp下所有模型(不推荐,容易引发命名冲突) from packsapp.models import * # 更优方式:只导入你需要的特定模型 from packsapp.models import TargetModel1, TargetModel2
方法2:用Django的动态模型获取方法
如果你的应用或模型名称是动态生成的,或者不想直接导入模型类,可以用Django内置的apps.get_model方法:
from django.apps import apps # 第一个参数是应用名,第二个是模型类名 TargetModel = apps.get_model('packsapp', 'TargetModelName')
这种方式在写通用工具类、动态视图的时候特别好用。
为什么相对导入会报错?
你的项目根目录yantra_packs并不是一个Python包(除非你手动给它加了__init__.py,但Django默认不需要这么做),而grn和packsapp都是独立的顶级包。你用..试图跳出当前应用的包结构,自然会触发“超出顶级包”的错误。
最后别忘了确认两个应用都已经添加到项目settings.py的INSTALLED_APPS列表里,不然Django可能找不到对应的模型哦!
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

