Django 1.9 - makemigrations - 未检测到任何更改

时间:2016-03-22 11:55:07

标签: django migration

我尝试使用makemigrations命令在现有应用内创建迁移,但它输出"未检测到任何更改"。

通常我使用startapp命令创建新应用,但在创建时不会将其用于此应用。

调试后,我发现它没有创建迁移,因为应用程序中缺少migrations包/文件夹。

如果文件夹不存在或者我遗失了某些内容会不会更好?

35 个答案:

答案 0 :(得分:159)

要为应用创建初始迁移,请运行makemigrations并指定应用名称。将创建迁移文件夹。

./manage.py makemigrations <myapp>

您的应用必须首先包含在INSTALLED_APPS中(在settings.py内)。

答案 1 :(得分:26)

我的问题(以及解决方案)与上述问题有所不同。

我没有使用models.py文件,但创建了一个models目录,并在那里创建了my_model.py文件,我放置了我的模型。 Django无法找到我的模型,所以它写道没有适用的迁移。

我的解决方案是:在my_app/models/__init__.py文件中我添加了这一行: from .my_model import MyModel

答案 2 :(得分:26)

makemigrations命令期间,django没有检测到要迁移的内容有多种可能的原因。

  1. 迁移文件夹您的应用中需要迁移包。
  2. INSTALLED_APPS 您需要在INSTALLED_APPS .dict
  3. 中指定您的应用
  4. 详细程度首先运行makemigrations -v 3以获得详细程度。这可能会解决这个问题。
  5. 完整路径INSTALLED_APPS中,建议指定完整的模块应用配置路径&#39; apply.apps.MyAppConfig&#39;
  6. - 设置您可能需要确保设置了正确的设置文件:manage.py makemigrations --settings mysite.settings
  7. 指定应用名称明确将应用名称放在 manage.py makemigrations myapp 中 - 这样可以缩小应用的迁移范围,并帮助您找出问题所在。
  8. 模型元检查您的模型元中是否有app_label

  9. 调试django 调试django核心脚本。 makemigrations命令非常简单。 Here's how to do it in pycharm。相应地更改脚本定义(例如:makemigrations --traceback myapp

  10. 多个数据库:

    • Db Router 使用django db路由器时,路由器类(您的自定义路由器类)需要实现allow_syncdb方法。
      

    makemigrations始终为模型更改创建迁移,但是如果   allow_migrate()返回False,

答案 3 :(得分:23)

我已经阅读了很多这个问题的答案,经常说明只是以其他方式运行makemigrations。但对我来说,问题出在模型的Meta子类中。

我的应用配置显示为label = <app name>(在apps.py文件中,models.py旁边,views.py等。如果您的元类没有任何机会与应用标签具有相同的标签(例如,因为您将一个太大的应用分成多个应用),则不会检测到任何更改(并且没有任何有用的错误消息)。所以在我的模型课中我现在有:

class ModelClassName(models.Model):

    class Meta:
        app_label = '<app name>' # <-- this label was wrong before.

    field_name = models.FloatField()
    ...

在这里运行Django 1.10。

答案 4 :(得分:10)

这是一个评论,但应该是一个答案。

确保您的应用名称位于settings.py INSTALLED_APPS中,否则无论您执行什么操作,都不会运行迁移。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'blog',
]

然后运行:

./manage.py makemigrations blog

答案 5 :(得分:6)

有时i优于./manage.py makemigrations,因为它可以处理应用之间的某些冲突。

这些场合是静默发生的,需要花费几个小时./manage.py makemigrations <myapp>才能理解可怕的swearing消息的真正含义。

因此,使用以下命令是一个更好的选择:

No changes detected

答案 6 :(得分:5)

我从django外部复制了一个表,默认将Meta类设置为“ managed = false”。例如:

class Rssemailsubscription(models.Model):
    id = models.CharField(primary_key=True, max_length=36)
    ...
    area = models.FloatField('Area (Sq. KM)', null=True)

    class Meta:
        managed = False
        db_table = 'RSSEmailSubscription'

通过将managed更改为True,makemigrations开始获取更改。

答案 7 :(得分:4)

我还有另一个这里没有描述的问题,这让我发疯了。

class MyModel(models.Model):
    name = models.CharField(max_length=64, null=True)  # works
    language_code = models.CharField(max_length=2, default='en')  # works
    is_dumb = models.BooleanField(default=False),  # doesn't work

我在复制和粘贴的一行中有一个尾随的','。 is_dumb所在的行不会使用'./manage.py makemigrations'创建模型迁移,但也不会引发错误。删除'后,它按预期方式工作。

因此,在复制粘贴时要小心:-)

答案 8 :(得分:3)

将新模型添加到django api应用程序并运行python manage.py makemigrations时,该工具未检测到任何新模型。

奇怪的是,makemigrations确实选择了旧模型,但这是因为urlpatterns链中引用了旧模型,并且该工具以某种方式检测到了它们。因此,请注意这种行为。

问题是因为对应于models包的目录结构具有子包,并且所有__init__.py文件均为空。他们必须在每个子文件夹和模型 __init__.py中显式导入所有必需的类,以便Django使用makemigrations工具将其提取。

models
  ├── __init__.py          <--- empty
  ├── patient
  │   ├── __init__.py      <--- empty
  │   ├── breed.py
  │   └── ...
  ├── timeline
  │   ├── __init__.py      <-- empty
  │   ├── event.py
  │   └── ...

答案 9 :(得分:1)

我通过以下方法解决了这个问题:

  1. 删除“ db.sqlite3”文件。 问题,这是因为您当前的数据库将被删除,因此您必须重新进行重新构建。
  2. 在已编辑应用的迁移文件夹内,删除上一个更新的文件。请记住,第一个创建的文件是:“ 0001_initial.py”。例如:我创建了一个新类,并通过“ makemigrations”和“ migrate”过程进行了注册,现在创建了一个名为“ 0002_auto_etc.py”的新文件;删除它。
  3. 转到“ pycache ”文件夹(位于migrations文件夹内),然后删除文件“ 0002_auto_etc.pyc”。
  4. 最后,转到控制台并使用“ python manage.py makemigrations”和“ python manage.py migration”。

答案 10 :(得分:1)

解决方案是您必须将应用程序包含在INSTALLED_APPS中。

我错过了,发现了同样的问题。

指定我的应用名称迁移成功后

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'boards',
]

请注意,我最后提到的是木板,这是我的应用名称。

答案 11 :(得分:1)

这可以通过使用下面提到的两个步骤来完成。

  1. 将您的应用添加到settings.py > INSTALLED_APPS
  2. 打开 admin.py

from .models import upImg
# Register your models here.
admin.site.register(upImg)

注意:用 upImg 中定义的 className 替换 models.py

之后看看是否还有 python manage.py makemigrations 剩余。如果有,也执行 python manage.py migrate

有关详细信息,请关注此django tutorial

答案 12 :(得分:1)

您可能还会遇到的一个非常愚蠢的问题是在模型中定义两个class Meta。在这种情况下,运行makemigrations时不会应用对第一个所做的任何更改。

class Product(models.Model):
    somefield = models.CharField(max_length=255)
    someotherfield = models.CharField(max_length=255)

    class Meta:
        indexes = [models.Index(fields=["somefield"], name="somefield_idx")]

    def somefunc(self):
        pass

    # Many lines...

    class Meta:
        indexes = [models.Index(fields=["someotherfield"], name="someotherfield_idx")]

答案 13 :(得分:1)

我知道这是一个老问题,但是我整天都在同一个问题上作斗争,而我的解决方案很简单。

我的目录结构类似于...

apps/
   app/
      __init__.py
      app_sub1/
           __init__.py
           models.py
      app_sub2/
           __init__.py
           models.py
      app_sub3/
           __init__.py
           models.py
   app2/
      __init__.py
      app2_sub1/
           __init__.py
           models.py
      app2_sub2/
           __init__.py
           models.py
      app2_sub3/
           __init__.py
           models.py
    main_app/
      __init__.py
      models.py

由于直到我遇到问题的所有其他模型都被导入到其他地方,最终从main_app中注册的INSTALLED_APPS导入,我很幸运,他们一切正常。

但是,当我最终添加一个新模型文件时,我只将每个app添加到INSTALLED_APPS而不是app_sub*时,Django完全忽略了它。

我的解决方法是将models.py文件添加到每个app的基本目录中,就像这样...

apps/
   app/
      __init__.py
      models.py <<<<<<<<<<--------------------------
      app_sub1/
           __init__.py
           models.py
      app_sub2/
           __init__.py
           models.py
      app_sub3/
           __init__.py
           models.py
   app2/
      __init__.py
      models.py <<<<<<<<<<--------------------------
      app2_sub1/
           __init__.py
           models.py
      app2_sub2/
           __init__.py
           models.py
      app2_sub3/
           __init__.py
           models.py
    main_app/
      __init__.py
      models.py

,然后将from apps.app.app_sub1 import *等添加到每个appmodels.py文件中。

Bleh ...这花了我很长时间才弄清楚,而且我找不到任何解决方案...我什至转到了Google搜索结果的第2页。

希望这对某人有帮助!

答案 14 :(得分:1)

  1. 确保您的应用在settings.py中的installed_apps中被提及
  2. 确保您的模型类扩展了模型。

答案 15 :(得分:1)

我忘了提出正确的论点:

class LineInOffice(models.Model):   # here
    addressOfOffice = models.CharField("Корхоная жош",max_length= 200)   #and here
    ...

在models.py中 然后开始消除烦人的情绪

在应用“ myApp”中未检测到更改

答案 16 :(得分:1)

根据official documentation中的“迁移”部分,我对django 3.0有类似的问题,运行它足以更新我的表结构:

python manage.py makemigrations
python manage.py migrate

但是输出始终是相同的:我执行了“ makemigrations”脚本后,“未检测到更改”关于我的模型。 我要在数据库上更新的模型的models.py出现语法错误:

field_model : models.CharField(max_length=255, ...)

代替:

field_model = models.CharField(max_length=255, ...)

解决了这个愚蠢的错误,使用这些命令可以顺利进行迁移。也许这可以帮助某人。

答案 17 :(得分:1)

另一个极端情况和解决方案:

我添加了一个布尔字段,并同时添加了一个引用其名称@doh的@property。注释了该属性,并且迁移看到并添加了新字段。重命名了酒店,一切都很好。

答案 18 :(得分:1)

在创建名为deals的新应用程序时遇到了另一个问题。我想在该应用程序中分离模型,所以我有两个名为deals.pydealers.py的模型文件。 运行python manage.py makemigrations时,我得到了:No changes detected

我继续前进到__init__.py里面,该文件位于我制作的模型文件所在的目录(交易和经销商)中

from .deals import *
from .dealers import *

然后makemigrations命令起作用。

事实证明,如果您不打算在任何地方导入模型,或者模型文件名不是models.py,那么就不会检测到模型。

发生在我身上的另一个问题是我在settings.py中编写应用的方式:

我有:

apps.deals

它应该已经包含了根项目文件夹:

cars.apps.deals

答案 19 :(得分:0)

另一种可能性是,您压缩了一些迁移并应用了所得到的迁移,但是却忘记了从其中删除replaces属性。

答案 20 :(得分:0)

这个错误的问题是我包括了:

class Meta:
   abstract = True

要为其迁移的内部模型。

答案 21 :(得分:0)

您能做的最好的事情是,删除现有数据库。就我而言,我使用的是phpMyAdmin SQL数据库,因此我在此处手动删除了创建的数据库。

删除后: 我在PhpMyAdmin中创建数据库,但不添加任何表。

再次运行以下命令:

python manage.py makemigrations

python manage.py migrate

这些命令之后:您可以看到django在数据库中自动创建了其他必要的表(大约有10个表)。

python manage.py makemigrations <app_name>

python manage.py migrate

最后:在上述命令之后,您创建的所有模型(表)都将直接导入数据库。

希望这会有所帮助。

答案 22 :(得分:0)

这可能希望对其他人有所帮助,因为我最终花了数小时试图将其追赶下去。

如果您的模型中的函数 具有相同的名称,则会删除该值。事后看来很明显,但仍然如此。

因此,如果您有这样的事情:

class Foobar(models.Model):
    [...]
    something = models.BooleanField(default=False)

    [...]
    def something(self):
        return [some logic]

在这种情况下,该函数将覆盖上面的设置,使其对makemigrations“不可见”。

答案 23 :(得分:0)

尝试在admin.py中注册模型,这是一个示例:- admin.site.register(YourModelHere)

您可以执行以下操作: 1. admin.site.register(YourModelHere)#在admin.py中 2.重新加载页面,然后重试 3.按CTRL-S并保存 4.可能有错误,特别是检查models.py和admin.py 5.或者,最后,只需重启服务器

答案 24 :(得分:0)

方法:1

步骤:1

确保您的应用必须包含在 settings.py 中的 INSTALLED_APPS

步骤:2

python manage.py makemigrations <appname>

如果显示相同的消息(未检测到更改)

!警告这对您的项目来说非常危险,因此请确保在应用方法 2 之前为您的项目做好备份。

方法二

重命名您的应用程序名称并使用:

django-admin startapp <appname>

从旧应用复制所有 .py 文件 except

  • 迁移文件夹
  • pycache 文件夹
  • init.py
  • test.py 文件(如果您没有在其中编写代码)


并粘贴到您最近制作的新应用中

请记住,您必须为新应用使用完全相同的名称,否则您必须在项目中进行更多更改。

答案 25 :(得分:0)

如果模型Meta中包含managed = True,则需要将其删除并进行迁移。然后再次运行迁移,它将检测到新更新。

答案 26 :(得分:0)

可能的原因可能是删除了现有的数据库文件和迁移文件夹 您可以使用python manage.py makemigrations <app_name>正常工作。我曾经遇到过类似的问题。

答案 27 :(得分:0)

以我为例,我首先向模型添加了一个字段,而Django说没有更改。

比起我决定更改模型的“表名”,makemigrations起作用了。 比起将表名改回默认值,新字段也在那里。

在django迁移系统中有一个“错误”,有时看不到新字段。可能与日期字段有关。

答案 28 :(得分:0)

在我的情况下,我忘记插入类参数

错误:

class AccountInformation():

正确

class AccountInformation(models.Model):

答案 29 :(得分:0)

我的问题比上面的答案要简单得多,而且可能是更常见的原因,只要您的项目已经建立并可以运行。在我的一个已经使用了很长时间的应用程序中,迁移似乎很困难,因此,我急着做了以下事情:

rm -r */migrations/*
rm db.sqlite3
python3 manage.py makemigrations
No changes detected

哇?

我错误地还删除了所有__init__.py文件:(-进入后,一切又恢复正常了:

touch ads1/migrations/__init__.py

对于我的每个应用程序,makemigrations再次起作用。

事实证明,我已经通过复制另一个应用程序手动创建了一个新应用程序,却忘记了将__init__.py放在migrations文件夹中,这使我感到一切都变得很糟糕-导致我的工作变得更糟如上所述的rm -r

希望这可以帮助某人在几个小时内发誓“未检测到更改”错误。

答案 30 :(得分:0)

另一个可能的原因是,如果您在其他文件(而不是在程序包中)中定义了某些模型,而没有在其他任何地方引用它。

对我来说,只需将ifconfig eth0:1 192.168.1.6 netmask 255.255.255.0 up 添加到from .graph_model import *(其中admin.py是新文件)即可解决此问题。

答案 31 :(得分:0)

首先,请确保您的应用已在setting.py中的Installed_app中注册。 那么上面的答案就很好了

答案 32 :(得分:0)

INSTALLED_APPS = [

'blog.apps.BlogConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

]

确保“ blog.apps.BlogConfig”(此设置包含在settings.py中,以便进行应用迁移)

然后运行python3 manage.py makemigrations博客或您的应用名称

答案 33 :(得分:0)

您应将polls.apps.PollsConfig添加到INSTALLED_APPS中的setting.py

答案 34 :(得分:-1)

好吧,我确定您尚未设置模型,所以它现在迁移了多少剂量??

因此,解决方案是设置所有变量,并设置Charfield,Textfield ....并迁移它们,它将起作用。