MacOS环境下Django 1.10.6报django_session不存在错误求助
这个错误的核心原因很明确:Django的核心系统表(比如django_session)没有被创建,而这通常是因为你没有在项目根目录下正确执行migrate命令导致的。下面是一步步的解决方案:
1. 先定位到正确的工作目录
你需要切换到包含manage.py的项目根目录——这是执行Django管理命令的唯一正确位置。很多人会误在应用目录或者子目录下执行命令,这就会导致核心应用的迁移无法被处理。
打开终端,用命令切换到根目录:
cd /path/to/your-django-project
执行ls命令确认,你应该能看到manage.py文件,以及你的应用目录(比如sites)。
2. 确认核心应用已启用
打开项目根目录下的settings.py,检查INSTALLED_APPS列表,确保包含以下核心应用(默认配置里应该有,但以防被误删):
INSTALLED_APPS = [ # 其他自定义应用... 'django.contrib.sessions', 'django.contrib.auth', 'django.contrib.contenttypes', # 其他系统应用... ]
django.contrib.sessions是生成django_session表的关键应用,必须存在于列表中。
3. 执行完整的迁移命令
之前你只能在单个应用下执行migrate,但这只会处理该应用的迁移,而Django自带的核心应用(比如sessions、auth)的迁移文件不在你的应用目录里,必须通过根目录的migrate命令来统一处理:
先执行(如果你的自定义应用有未生成的迁移文件):
python manage.py makemigrations
然后执行完整的迁移,这会创建所有核心表和你自己应用的表:
python manage.py migrate
注意:不要在命令后面加应用名(比如python manage.py migrate sites),那样只会处理sites应用的迁移,跳过了核心系统的表创建。
4. 检查数据库文件权限(针对SQLite)
如果以上步骤执行失败,可能是MacOS下SQLite数据库文件(默认是db.sqlite3)的权限问题。Django需要读写这个文件的权限:
用命令查看权限:
ls -l db.sqlite3
如果当前用户没有读写权限,执行以下命令修改:
chmod 644 db.sqlite3
然后重新执行migrate命令。
5. 极端情况:重置数据库(备份后操作)
如果之前的数据库已经损坏,你可以备份好数据后重置:
- 删除项目根目录下的
db.sqlite3文件 - 重新执行
python manage.py migrate,这会重新创建一个全新的数据库,包含所有核心表和应用表。
为什么Linux下正常?因为你在Linux环境下正确地在项目根目录执行了migrate,所有核心表都被创建了;而MacOS下你只在单个应用下执行迁移,漏掉了Django自带系统的表,所以访问时会找不到django_session表。
内容的提问来源于stack exchange,提问作者Fábio Marques

