为何django-carrot的迁移文件生成在虚拟环境中?
为什么django-carrot的迁移文件生成在虚拟环境里?怎么解决?
我来帮你拆解下这个问题,顺便给你靠谱的解决方案:
问题根源
你遇到的情况其实是Django的默认行为导致的:django-carrot是你安装在虚拟环境里的第三方依赖包,它的代码目录属于虚拟环境,而非你的项目仓库。当你直接针对carrot这个第三方app执行makemigrations时,Django会默认把迁移文件生成在该app的原生目录里——也就是你看到的venv/lib/python3.6/site-packages/carrot/migrations/。
但虚拟环境本来就是用来隔离依赖的,不会被提交到Git这类版本控制系统,所以这些迁移文件自然没法纳入项目管理,这肯定不是你想要的结果。
两种解决方案,任你选
方案1:直接指定迁移文件生成目录
这种方法简单直接,适合快速解决问题:
- 先在你的项目根目录创建一个专门存放carrot迁移的文件夹,比如叫
carrot_migrations:
mkdir carrot_migrations
- 执行
makemigrations时,用--directory参数指定生成到这个新目录:
python manage.py makemigrations carrot --directory carrot_migrations
- 最后在
settings.py里告诉Django去哪里找这些迁移文件——如果没有MIGRATION_MODULES配置就新增:
MIGRATION_MODULES = { 'carrot': 'carrot_migrations', }
这样之后运行migrate命令时,Django就会优先读取你项目里的这个目录,而不是虚拟环境里的路径。
方案2:创建本地代理app(更符合Django最佳实践)
这种方法更规范,适合长期维护的项目:
- 先创建一个属于你项目的本地app,比如叫
carrot_local:
python manage.py startapp carrot_local
- 把这个新app添加到
settings.py的INSTALLED_APPS里(放在carrot后面就行):
INSTALLED_APPS = [ # 其他已有的app... 'carrot', 'carrot_local', # 新增这一行 ]
- 执行
makemigrations命令,指定把carrot的迁移生成到carrot_local的migrations目录:
python manage.py makemigrations carrot --directory carrot_local/migrations
- 同样在
settings.py里配置MIGRATION_MODULES:
MIGRATION_MODULES = { 'carrot': 'carrot_local.migrations', }
这样所有和carrot相关的迁移文件都会保存在你项目的carrot_local/migrations目录下,完全可以正常提交到版本控制系统。
最后别忘了清理
记得把虚拟环境里carrot/migrations目录下自动生成的那些迁移文件删掉,避免后续执行migrate时出现混淆。
内容的提问来源于stack exchange,提问作者vidstige
相关产品推荐
相关产品推荐

