Django多层模型目录下如何简化__init__.py中的批量导入代码
解决方案
你提到的短导入写法是可以实现的,之前的写法不生效是因为Python默认情况下from 包 import *不会自动导入子模块的内容,只有在包的__init__.py里定义了__all__列表指定导出对象后才会生效,具体操作如下:
实现步骤
- 在子模块目录下新增
__init__.py声明要导出的模型
首先在app/models/accounts和app/models/social两个目录下分别创建__init__.py文件,通过__all__变量指定当前包对外暴露的模型类:app/models/accounts/__init__.py内容:
from .user import User from .profile import Profile __all__ = ["User", "Profile"]app/models/social/__init__.py内容:
from .facebook import Facebook from .twitter import Twitter from .linkedin import LinkedIn __all__ = ["Facebook", "Twitter", "LinkedIn"] - 修改根models目录的
__init__.py
现在你可以直接用你想要的批量导入写法替换原有长代码,功能完全和之前一致:from .accounts import * from .social import *
注意事项
- 不同子包导出的模型类名不要重复,否则后导入的类会覆盖先导入的
- 该结构完全兼容Django的模型自动发现逻辑,迁移、admin注册、外键关联等操作都和原有写法没有差异
- 如果后续新增了模型,只需要在对应子包的
__init__.py的__all__列表里添加新类名即可
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

