导入依赖Django作为ORM的包时触发ModuleNotFoundError问题咨询
多客户端场景下使用Django ORM包的解决方案
结合你提到的环境(Django 2.0.3、Python 3.6.3),还有已经完成的包打包步骤,我来帮你梳理下多客户端使用时的核心问题和解决办法:
1. 先确认你的mypkg是标准可复用的Django应用
首先得保证你的包是符合Django app规范的,不然多客户端适配起来会很麻烦。检查下结构是不是这样:
mypkg/ __init__.py models.py apps.py migrations/ __init__.py 0001_initial.py
另外apps.py里的AppConfig一定要正确,别写错包名:
# mypkg/apps.py from django.apps import AppConfig class MypkgConfig(AppConfig): name = 'mypkg'
2. 让每个客户端独立管理Django配置
多客户端的核心问题就是各自的数据库、配置可能不一样,所以你的包绝对不能硬编码Django配置,得让每个客户端自己初始化Django环境。
客户端脚本的正确打开方式
在client/myclient/main.py里,必须先初始化Django,再导入你的包,顺序不能乱:
# client/myclient/main.py import os import django # 指向客户端自己的settings文件 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'client.myclient.settings') django.setup() # 现在就能正常用mypkg的模型了 from mypkg.models import YourModel # 举个简单的使用例子 latest_obj = YourModel.objects.latest('id') print(latest_obj)
客户端要配自己的settings.py
每个客户端都得有自己的settings.py,把你的包加进去,再配置专属的数据库:
# client/myclient/settings.py DEBUG = True SECRET_KEY = '随便整个密钥就行,客户端自己用的' INSTALLED_APPS = [ 'django.contrib.contenttypes', # ORM必须依赖的模块 'django.contrib.auth', # 如果你的包用到了用户模型就加,不用可以去掉 'mypkg', # 把你的包添加到这里 ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': './client_db.sqlite3', # 每个客户端可以用不同的数据库文件/地址 } }
3. 客户端安装你的包
你已经生成了mypkg-0.0.1.tar.gz,每个客户端只要用pip安装这个包就行:
pip install /path/to/your/mypkg-0.0.1.tar.gz
如果以后传到PyPI上,直接pip install mypkg更方便。
4. 每个客户端独立执行数据库迁移
因为每个客户端的数据库是分开的,所以得让他们自己跑迁移命令:
# 先进到客户端项目目录里 cd client/myclient # 指定客户端自己的settings export DJANGO_SETTINGS_MODULE=client.myclient.settings # 执行迁移,把mypkg的表建到客户端的数据库里 python -m django migrate
5. 包里面别搞硬编码
一定要确保你的包代码里没有直接写死配置,比如不要直接引用settings.DATABASES这种,完全依赖Django的配置系统就行。比如模型就正常定义:
# mypkg/models.py from django.db import models class YourModel(models.Model): title = models.CharField(max_length=200) # 其他字段正常加就行
常见坑点排查
- 如果客户端找不到mypkg:检查包是不是装对了环境,比如虚拟环境有没有切换对
- Django初始化报错:看看
DJANGO_SETTINGS_MODULE路径是不是写错了,settings文件有没有语法错误 - 迁移失败:确认客户端的INSTALLED_APPS里加了mypkg,数据库配置也没问题
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

