运行python manage.py runserver时Django REST API应用启动失败求助
解决Django REST Framework启动时AppRegistryNotReady异常
从你的错误日志能直接定位到问题根源:main/models.py第21行的Token.objects.get_or_create(user=user)代码,是在模型模块的全局作用域里执行的——而此时Django的模型系统还没完成初始化,触发了AppRegistryNotReady("Models aren't loaded yet.")异常。
为什么会出这个问题?
Django启动时会按顺序加载所有已安装应用的模型模块,模块级别的代码会在模型注册到应用注册表之前就运行。这时候调用ORM查询(比如get_or_create),Django还没准备好处理数据库操作,自然就抛出了这个错误。
解决方案:把数据库操作移到合适的时机执行
根据你的需求,推荐两种常用的解决方式:
1. 使用Django信号自动生成用户Token(适合为新用户自动创建Token的场景)
如果你的需求是给每个新创建的User自动生成Auth Token,用post_save信号实现最合适——信号会在模型完全初始化后触发:
# main/models.py from django.db.models.signals import post_save from django.contrib.auth.models import User from django.dispatch import receiver from rest_framework.authtoken.models import Token # 监听User模型的保存事件,新用户创建时自动生成Token @receiver(post_save, sender=User) def create_user_auth_token(sender, instance=None, created=False, **kwargs): if created: Token.objects.create(user=instance)
然后修改应用配置文件main/apps.py,确保信号被正确加载:
from django.apps import AppConfig class MainConfig(AppConfig): name = 'main' def ready(self): # 导入models模块,保证信号注册生效 import main.models
2. 在AppConfig的ready方法中执行一次性操作(适合初始化特定用户Token的场景)
如果是要给某个特定用户(比如管理员)初始化Token,把代码放到应用配置的ready方法里——这个方法会在Django所有模型加载完成后执行:
# main/apps.py from django.apps import AppConfig from django.contrib.auth.models import User from rest_framework.authtoken.models import Token class MainConfig(AppConfig): name = 'main' def ready(self): # 尝试获取指定用户并创建Token,避免重复执行 try: target_user = User.objects.get(username='your_target_username') Token.objects.get_or_create(user=target_user) except User.DoesNotExist: # 用户不存在时可选择创建或跳过 pass
额外提示
- 永远不要在模型模块的全局级别执行任何数据库操作,包括ORM查询、对象创建等
- 如果是初始化测试数据,更推荐用Django的数据迁移或fixtures实现,这是更符合框架规范的做法
内容的提问来源于stack exchange,提问作者Plumb InFront
相关产品推荐
相关产品推荐

