Django集成APScheduler调用模型时报Apps aren't loaded yet错误如何解决?
错误原因
这个报错的根本原因是你在Django应用未完成注册加载的阶段,提前导入了ORM模型。从报错栈可以看到,加载apps.py时会先执行文件顶部的导入逻辑,此时引入scheduler模块会触发顶部的UserProfile模型导入,而这一步发生在Django完成所有应用注册流程之前,因此触发了AppRegistryNotReady异常。
你修改为仅打印内容时不会报错,是因为该场景下没有涉及模型导入,不会触发Django的应用加载状态检查。
解决方案
按以下两步修改即可解决:
- 修改
scheduler.py,将模型导入移到定时任务函数内部
这样只有任务实际执行时才会导入模型,此时Django应用已经完成加载,不会触发异常:
from apscheduler.schedulers.background import BackgroundScheduler sched = BackgroundScheduler() def period(): # 模型导入移到函数内部 from accounts.models import UserProfile users = UserProfile.objects.all() print(users) def start(): sched.add_job(period, 'interval', seconds=10) sched.start()
- 修改
apps.py,将scheduler的导入移到ready方法内ready方法是Django所有应用完成注册后才会执行的钩子,在这里导入可以彻底避免提前加载的问题,同时增加判断避免runserver自动重载导致定时任务启动两次:
from django.apps import AppConfig class DashboardConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'dashboard' def ready(self): import os # 仅在主进程启动时执行,避免自动重载导致任务重复启动 if os.environ.get('RUN_MAIN') == 'true': from dashboard.scheduler import start start()
内容的提问来源于stack exchange,提问作者edche
相关产品推荐
相关产品推荐

