Django 项目app 迁移到其它项目

73 阅读2分钟

本文记录了我项目app迁移到其它的全过程,包括踩过的坑

使用情景: 当你需要将a项目的某个app迁移到b项目中,并且你还要实现数据表(包括数据)的迁移

本文默认必要包依赖和settings配置b项目已经都有了。

🚀步骤:

1. 项目迁移

将a项目的该app复制到b项目中,并将其注册到b项目的INSTALLED_APPS中,当然,如果有其它的中间件或者设置啥的,也记得迁移到settings中。

2. 重置迁移文件

删除b项目中该app目录下的migrations文件夹中所有迁移文件,除了__init__.py

3. 在目标项目中生成并应用迁移

python manage.py makemigrations your_app_name
python manage.py migrate your_app_name

这一步可能会报错:django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency accounts.0001_initial on database ‘default’.

原因及解决方案:"如果我们一开始使用的是django原生模型User,在后来的开发中,我们在其他app中想使用自己的User模型,在我们makemigrations时,就会出现以上错误"

解决方案

  1. 在setttings文件中注释掉:django.contrib.admin
  2. 在urls文件中注释掉:path('admin/', admin.site.urls)
  3. 重新migrate
  4. 将刚才注释的代码加回去
  5. 重新migrate

4. 导出源项目的数据

进入到源项目中,并在根目录中运行以下命令将数据变成json格式导出

python manage.py dumpdata your_app_name > data.json	

5. 将数据导入目标项目

  1. 将生成的data.json复制到b项目目录下。
  2. 在b项目的根目录中运行以下命令并加载数据
python manage.py loaddata data.json

这一步可能会报错:"UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte"

原因及解决方案: 你导出数据时的数据格式(比如是UTF-16LE)跟你想导入的数据库所需数据格式不一致,比如你导出的数据的编码是UTF-16LE,但是你想导入的数据库它要求数据的编码是utf-8,导致写入失败。
PS:具体的数据编码可以看编辑器(pycharm,vscode)右下角

解决方案

  1. 使用Notepad2编辑器直接修改data.json文件的编码为UTF8.
  2. 重新执行命令加载数据即可。