我尝试使用makemigrations命令在现有应用内创建迁移,但它输出"未检测到任何更改"。
通常我使用startapp
命令创建新应用,但在创建时不会将其用于此应用。
调试后,我发现它没有创建迁移,因为应用程序中缺少migrations
包/文件夹。
如果文件夹不存在或者我遗失了某些内容会不会更好?
答案 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没有检测到要迁移的内容有多种可能的原因。
INSTALLED_APPS
.dict makemigrations -v 3
以获得详细程度。这可能会解决这个问题。INSTALLED_APPS
中,建议指定完整的模块应用配置路径&#39; apply.apps.MyAppConfig&#39; manage.py makemigrations --settings mysite.settings
manage.py makemigrations myapp
中 - 这样可以缩小应用的迁移范围,并帮助您找出问题所在。 模型元检查您的模型元中是否有app_label
调试django 调试django核心脚本。 makemigrations命令非常简单。 Here's how to do it in pycharm。相应地更改脚本定义(例如:makemigrations --traceback myapp
)
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)
我通过以下方法解决了这个问题:
答案 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)
这可以通过使用下面提到的两个步骤来完成。
settings.py
> INSTALLED_APPS
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 *
等添加到每个app
级models.py
文件中。
Bleh ...这花了我很长时间才弄清楚,而且我找不到任何解决方案...我什至转到了Google搜索结果的第2页。
希望这对某人有帮助!
答案 14 :(得分:1)
答案 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.py
和dealers.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
并粘贴到您最近制作的新应用中
请记住,您必须为新应用使用完全相同的名称,否则您必须在项目中进行更多更改。
答案 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 ....并迁移它们,它将起作用。