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

我启动了一个django 1.8项目,它使用迁移系统。
不知怎么的,事情变得一团糟,所以我从数据库中删除了迁移文件夹和表,现在我正试图重建它们,但没有成功

我有三个应用程序(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')]