You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:54:11