Ubuntu环境下Django项目报错ImportError: cannot import name 'DEFAULT_CURRENCY' from 'moneyed'
报错解决方案
你遇到的导入错误是py-moneyed版本与django-money版本不兼容导致的:py-moneyed v3.0及以上版本移除了顶层导出的DEFAULT_CURRENCY常量,改用get_default_currency()函数获取默认货币,而你安装的django-money版本仍然依赖旧版py-moneyed的导出规则。
可选用以下任意一种方案修复:
- 方案1:降级py-moneyed到兼容版本
执行命令:
pip install py-moneyed==2.0
建议将项目依赖全部冻结到requirements.txt文件中,后续部署直接用pip install -r requirements.txt安装,可避免多环境依赖版本不一致的问题。
- 方案2:兼容新版py-moneyed无需降级
在settings.py中导入djmoney相关配置的代码前,提前添加兼容代码:
from moneyed import get_default_currency, CURRENCIES, DEFAULT_CURRENCY_CODE DEFAULT_CURRENCY = get_default_currency()
定时任务实现方案
以下方案都可以满足「每2小时执行一次更新数据库」、「每日指定时间执行一次」的需求:
- 方案1:使用已安装的django-crontab
在settings.py中添加定时任务配置:
CRONJOBS = [ # 每2小时执行一次数据库更新,替换为你实际的任务函数路径 ('0 */2 * * *', '你的应用名.tasks.update_db'), # 每天凌晨1点执行每日任务,可自行修改时间参数 ('0 1 * * *', '你的应用名.tasks.daily_task'), ]
配置完成后执行python manage.py crontab add即可将任务自动写入系统crontab规则中,无需额外运行常驻服务,适合轻量定时需求。
- 方案2:使用已安装的django-background-tasks
给任务函数加上装饰器即可设置执行规则,自带任务执行日志、失败重试能力,需要单独运行常驻进程处理任务:
python manage.py process_tasks
- 方案3:直接使用Ubuntu原生crontab
编写Django自定义管理命令,在系统crontab中直接添加执行规则,无需依赖额外第三方Django包,稳定性最高。
内容的提问来源于stack exchange,提问作者eeman
相关产品推荐
相关产品推荐

