Django 1.8:为现有模式创建初始迁移
我启动了一个django 1.8项目,它使用迁移系统。Django 1.8:为现有模式创建初始迁移,django,django-migrations,Django,Django Migrations,我启动了一个django 1.8项目,它使用迁移系统。 不知怎么的,事情变得一团糟,所以我从数据库中删除了迁移文件夹和表,现在我正试图重建它们,但没有成功 我有三个应用程序(3models.pyfiles),模型准确地反映了表格 到目前为止,我发现最好的方法是: 删除所有迁移文件夹。完成了 删除django_迁移表中的所有内容。完成了 为每个应用程序运行python manage.py makemigrations--empty。完成了 运行python manage.py migrate--f
不知怎么的,事情变得一团糟,所以我从数据库中删除了迁移文件夹和表,现在我正试图重建它们,但没有成功 我有三个应用程序(3
models.py
files),模型准确地反映了表格
到目前为止,我发现最好的方法是:
迁移
文件夹。完成了李>
django_迁移
表中的所有内容。完成了李>
python manage.py makemigrations--empty
。完成了李>
python manage.py migrate--false
。完成!(尽管只有在每次执行makemigrations
命令后运行它时,它才起作用makemigrations
命令,收到以下错误:django.db.utils.OperationalError:(1054,“字段列表”中的“帐户\计划.最大项目\大小”未知列)
我在这件事上花了好几个小时。我如何初始化迁移,这样我就可以在每次迁移都不中断的情况下继续工作
为什么这么复杂?为什么没有简单的一行:initiate\u migrations\u from\u schema
编辑:现在事情变得更糟了。我截断了
django_migrations
表,删除了所有migrations
文件夹。现在我试着运行
python manage.py migrate——假首字母(我在开发文档中找到的),这样它就可以设置Django的所有“内部”应用程序(auth、session等),我得到:
(1054,“django内容类型”中的未知列“名称”)
现在,这个“专栏”不是真正的列。它是Django的contenttypes
应用程序中定义的@属性。这是怎么回事?为什么它要将名称
属性标识为真正的列?我遇到过这种情况,但我从来都不需要删除数据库来解决它。通常我会从应用程序中删除迁移文件夹,然后重新启动从数据库中移动迁移项
我会尝试一次运行一个应用程序进行迁移。如果该应用程序的任何一个依赖于其他表,则显然要最后添加它们
另外,我通常只是运行,python manage.py makemigrations然后才运行python manage.py migrate,即使在最初的迁移中,它在Django 1.7和1.8中也应该可以正常工作。虽然我不知道为什么,我希望它在将来能够工作。
在做了大量的试验并通过Django的开发站点()之后。
以下是步骤(适用于遇到此问题的人):
清空django_迁移
表:delete from django_迁移;
对于每个应用程序,删除其migrations
文件夹:rm-rf/migrations/
重置“内置”应用程序的迁移:python manage.py migrate--false
对于每个应用程序运行:python manage.py makemigrations
。注意依赖关系(带有ForeignKey的模型应在其父模型之后运行)
最后:python manage.py migrate——假首字母
在那之后,我运行了最后一个命令,没有使用--false initial
标志,只是为了确保
现在一切正常,我可以正常使用迁移系统了
我相信我不是唯一一个遇到这个问题的人。它必须被更好地记录,甚至简化
针对Django 1.9用户的更新:
我在Django 1.9.4中又遇到了这种情况,第5步失败了。
我所要做的就是将--fake initial
替换为--fake
,以使其正常工作。如果您使用路由器,可能会出现问题。检查方法允许\u migrate
是否在routers.py
中正确执行。尝试将返回值始终设置为True
,并检查它是否解决了问题,
def allow_migrate(self, db, app_label, model_name=None, **hints):
return True
django…,1.8,1.9
您想要实现的是压缩现有迁移并使用替换
发布时如何在不使用任何命令的情况下正确执行(一个不会影响数据库和同事的案例)
对于每个应用程序,请删除其迁移文件夹:
mv/migrations//migrationsOLD/
对于每个应用程序运行:python manage.py makemigrations
自定义每个新迁移:
- 如果您有一个复杂的应用程序,或者它们之间有多个应用程序和相关模型,为避免
CircularDependencyError
或ValueError:未处理的模型挂起操作
:
在
0002\u initial2.py
中准备第二次空迁移(将对app\u other::0001\u initial.py和
的依赖关系放在那里:0001\u initial.py
以及-所有与在其他应用程序的0001迁移步骤中创建的模型相关的外键、M2M)
一切都必须井然有序-有时需要更多的迁移来准备。在每次迁移中,请注意这里的依赖项
属性
- 注意初始值-验证自己在
migrationsOLD
中执行的所有RunPython
操作,并在需要时将代码复制到新的初始迁移中
- (对于
--false initial
是可选的)将initial=True
添加到所有新的迁移类中(如果已添加,则也添加0002)
- 添加
替换新迁移类中的
属性。(如自定义a挤压迁移
)。将所有来自
使用makemigrations
验证所有内容
断言“未检测到任何更改”
检查是否migrate-l
show[x]无处不在
断言类似:
[十] 0001_首字母
[十] 0002\u初始值2(102次挤压迁移) 0001_initial.py
0002_auto.py
...
0103_auto.py
0001_initial.py
0002_initial2.py (optional but sometimes required to satisfy dependency)
replaces = [(b'<app>', '0002_auto.py'), ..., (b'<app>', '0103_auto.py')]