Django 1.7 - makemigrations没有检测到变化

Tyr*_*ave 138 python django django-1.7 django-migrations

正如标题所说,我似乎无法让迁移工作.

该应用程序最初低于1.6,因此我了解迁移最初不会出现,事实上,如果我运行,python manage.py migrate我得到:

Operations to perform:
  Synchronize unmigrated apps: myapp
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
  Installing custom SQL...
  Installing indexes...
Running migrations:
  No migrations to apply.
Run Code Online (Sandbox Code Playgroud)

如果我对任何模型进行更改myapp,它仍然会按预期显示未迁移.

但如果我跑,python manage.py makemigrations myapp我得到:

No changes detected in app 'myapp'
Run Code Online (Sandbox Code Playgroud)

似乎没关系我运行命令的内容或方式,它从未检测到应用程序有更改,也没有将任何迁移文件添加到应用程序.

有没有办法迫使应用程序进行迁移,并基本上说"这是我的工作基础"或任何东西?或者我错过了什么?

我的数据库是一个PostgreSQL,如果它有帮助的话.

dro*_*ojf 180

如果您要从django 1.6中的现有应用程序进行切换,那么您需要执行文档中列出的一个前置步骤(如我所知):

python manage.py makemigrations your_app_label

文档并没有明显表明你需要在命令中添加app标签,因为它告诉你要做的第一件事就是python manage.py makemigrations失败.初始迁移是在1.7版本中创建应用程序时完成的,但如果您来自1.6,则不会执行.有关详细信息,请参阅文档中的"向应用程序添加迁移".


Moh*_*f C 43

这可能是由于以下原因:

  1. 您没有在INSTALLED_APPS列表中添加应用程序settings.py (您必须在应用程序文件夹中的apps.py中添加AppConfig子类的应用程序名称或虚线路径,具体取决于您使用的django版本).请参阅文档:INSTALLED_APPS
  2. migrations在这些应用中没有文件夹.(解决方案:只创建该文件夹).
  3. 您没有这些应用程序的__init__.py文件migrations夹内的文件.(解决方案:只需创建一个名为__init__.py的空文件)
  4. __init__.pyapp文件夹中没有文件.(解决方案:只需创建一个名为__init__.py的空文件)
  5. models.py的应用中没有文件
  6. 您的Python类(应该是模型)models.py不会继承django.db.models.Model
  7. 你在模型的定义中有一些语义错误 models.py

注意: 常见的错误是migrations.gitignore文件中添加文件夹.从远程仓库克隆时,本地仓库中将缺少文件migrations夹和/或__init__.py文件.这会导致问题.

我建议通过向文件添加以下行来忽略迁移.gitignore文件

*/migrations/*
!*/migrations/__init__.py
Run Code Online (Sandbox Code Playgroud)

  • 我已经克隆了我的项目,并且迁移文件夹没有推送到存储库,所以我必须添加迁移主管,然后添加 __init__.py 并且我能够进行迁移。谢谢你 (2认同)

Tyr*_*ave 28

好吧,看起来我错过了一个明显的步骤,但发布这个以防其他人也这样做.

当升级到1.7时,我的模型变得不受管理(managed = False) - 我像True以前一样拥有它们但似乎已经恢复了.

删除该行(默认为True)然后makemigrations立即运行创建了一个迁移模块,现在它正在运行.makemigrations将不适用于非托管表(事后很明显)

  • 请参阅此处的文档:https://docs.djangoproject.com/en/dev/ref/models/options/#managed (4认同)
  • 请澄清 - 您在哪里更改/添加"managed = False"?我有相同的问题 (3认同)

Gra*_*gon 19

我的解决方案没有在这里讨论,所以我发布了它.我一直在syncdb用于一个项目 - 只是为了让它运行起来.然后,当我尝试开始使用Django迁移时,它首先伪造它们然后会说它'OK'但数据库没有发生任何事情.

我的解决方案是删除我的应用程序的所有迁移文件,以及django_migrations表中应用程序迁移的数据库记录.

然后我刚做了一个初始迁移:

./manage.py makemigrations my_app

其次是:

./manage.py migrate my_app

现在我可以毫无问题地进行迁移.


小智 15

同意@furins.如果一切看起来都是有序的,但是出现了这个问题,请检查是否有任何属性方法与您尝试在Model类中添加的属性具有相同的标题.

  1. 删除与要添加的属性具有相似名称的方法.
  2. manage.py makemigrations my_app
  3. manage.py迁移my_app
  4. 添加方法.


Ima*_*ari 11

这是一个愚蠢的错误,但在模型类的字段声明行的末尾有一个额外的逗号,使该行无效.

当您复制粘贴def时会发生这种情况.来自迁移,它本身被定义为一个数组.

虽然这可能有助于某人:-)


rrr*_*rub 10

也许我来不及但是你试着migrations在你的应用程序中有一个__init__.py文件夹吗?


jay*_*y13 7

也许这会对某人有所帮助.我正在使用嵌套的应用程序.project.appname和我实际上在INSTALLED_APPS中有project和project.appname.从INSTALLED_APPS中删除项目允许检测更改.


小智 7

答案是在这个stackoverflow帖子,由Django 1.7中的 cdvv7788 迁移

如果您是第一次迁移该应用程序,则必须使用:

manage.py makemigrations myappname一旦你这样做,你可以做:

manage.py migrate如果您的应用程序在数据库中,修改了它的模型并且没有更新makemigrations上的更改,那么您可能还没有迁移它.将模型更改回原始形式,运行第一个命令(使用应用程序名称)并迁移...它会伪造它.一旦这样做,就可以在模型上放回更改,运行makemigrations并再次迁移,它应该可以正常工作.

我遇到了同样的麻烦,并且完成了上述工作.

我已经将我的django应用程序移动到了cloud9,由于某种原因,我从未捕获过初始迁移.


Pra*_*pta 7

以下为我工作:

  1. 将应用名称添加到settings.py
  2. 使用'python manage.py makemigrations'
  3. 使用'python manage.py migrate'

为我工作:Python 3.4,Django 1.10


小智 6

像我这样不喜欢迁移的人可以使用以下步骤.

  1. 删除要同步的更改.
  2. 运行python manage.py makemigrations app_label初始迁移.
  3. python manage.py migrate在进行更改之前运行以创建表.
  4. 粘贴您在第一步中删除的更改.
  5. 运行2.和3.步骤.

如果您混淆了这些步骤,请阅读迁移文件.更改它们以更正您的架构或删除不需要的文件,但不要忘记更改下一个迁移文件的依赖项部分;)

我希望这将有助于将来的某些人.


Sti*_*cky 5

你要检查settings.pyINSTALLED_APPS列表,并确保所有型号的应用程序是在那里上市.

makemigrations在项目文件夹中运行意味着它将查看更新与settings.py项目中包含的所有应用程序相关的所有表.一旦你包含它,makemigrations将自动包含应用程序(这节省了大量的工作,因此你不必makemigrations app_name为项目/网站中的每个应用程序运行).


fur*_*ins 5

以防万一您有一个不能由makemigrations标识的特定字段:检查两次是否具有相同名称的属性。

例:

field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)

# ... later

@property
def field(self):
    pass
Run Code Online (Sandbox Code Playgroud)

该属性将“覆盖”字段定义,因此更改不会被标识 makemigrations


Jit*_*ran 5

添加此答案是因为只有这种方法对我有帮助。

我删除了migrations文件夹 runmakemigrationsmigrate.
它仍然说:没有要申请的迁移。

我转到migrate文件夹并打开最后创建的文件,
评论我想要的迁移(它被检测到并在那里输入)
migrate再次运行。

这基本上是手动编辑迁移文件。
仅当您了解文件内容时才执行此操作。


Mar*_*ark 5

确保您的模型不是abstract. 我实际上犯了那个错误并且花了一段时间,所以我想我会发布它。