我试图使用makemigrations命令在现有应用程序中创建迁移,但输出“未检测到更改”。
通常,我使用startapp
命令创建新应用,但在创建该应用时并未将其用于该应用。
调试后,我发现它没有创建迁移,因为migrations
应用程序中缺少软件包/文件夹。
如果不存在该文件夹,还是创建丢失的文件夹,会更好吗?
makemigrations <myapp>
也如Alasdair所指出的那样更好地使用。
我试图使用makemigrations命令在现有应用程序中创建迁移,但输出“未检测到更改”。
通常,我使用startapp
命令创建新应用,但在创建该应用时并未将其用于该应用。
调试后,我发现它没有创建迁移,因为migrations
应用程序中缺少软件包/文件夹。
如果不存在该文件夹,还是创建丢失的文件夹,会更好吗?
makemigrations <myapp>
也如Alasdair所指出的那样更好地使用。
Answers:
要为应用创建初始迁移,请运行makemigrations
并指定应用名称。将创建迁移文件夹。
./manage.py makemigrations <myapp>
您的应用必须首先包含INSTALLED_APPS
(在settings.py内部)。
migrations
文件夹,则需要指定应用程序名称。如果您手动创建了应用程序,或者从没有迁移的旧版Django升级,则可能会发生这种情况。
__init__.py
在应用程序中使用一个名为“ migrations” 的python包(带有)。
我的问题(以及解决方案)与上述问题有所不同。
我没有使用models.py
文件,而是创建了一个models
目录并在my_model.py
其中创建了文件,并在其中放置了模型。Django找不到我的模型,因此它写道没有要应用的迁移。
我的解决方案是:在my_app/models/__init__.py
文件中添加以下行:
from .my_model import MyModel
django在makemigrations
命令执行期间未检测到要迁移的内容有多种可能的原因。
INSTALLED_APPS
.dict中指定您的应用makemigrations -v 3
冗长开始。这可能会为这个问题提供一些启示。INSTALLED_APPS
建议指定完整的模块应用程序配置路径“apply.apps.MyAppConfig”manage.py makemigrations --settings mysite.settings
manage.py makemigrations myapp
-不仅可以缩小应用程序的迁移范围,而且可以帮助您隔离问题。模型元检查你有合适的app_label
模型中的元
调试django调试django核心脚本。makemigrations命令非常简单。这是在pycharm中执行的方法。相应地改变你的脚本定义(例如:makemigrations --traceback myapp
)
allow_syncdb
方法。makemigrations总是为模型更改创建迁移,但是如果allow_migrate()返回False,
from recurrence.forms import RecurrenceField
但是应该是from recurrence.fields import RecurrenceField
。
makemigrations
脚本查找从连接的模型urls.py
。” 这里找到stackoverflow.com/questions/43093651/...
python manage.py makemigrations -v 3 <app_name>
我已经读过许多关于这个问题的答案,通常说它们只是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。
这是一个评论,但可能应该是一个答案。
确保您的应用程序名称位于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
我还有另一个这里未描述的问题,这让我发疯。
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'创建模型迁移,但也不会引发错误。删除“后,”它按预期方式工作。
因此,在复制粘贴时请多加注意:-)
is_dumb
等于(models.BooleanField(default=False), )
它makemigrations
不知道如何转换为数据库列。
我从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开始接受更改。
我这样做来解决了这个问题:
我忘了提出正确的论点:
class LineInOffice(models.Model): # here
addressOfOffice = models.CharField("Корхоная жош",max_length= 200) #and here
...
在models.py中,然后就开始消除烦人的
在应用程序“ myApp”中未检测到更改
另一个可能的原因是,如果您在其他文件中(而不是在程序包中)定义了某些模型,而在其他任何地方都没有引用过。
对我来说,简单地增加from .graph_model import *
,以admin.py
(其中graph_model.py
为新文件)解决了这一问题。
我的问题比上面的答案要简单得多,并且可能是一个更普遍的原因,只要您的项目已经建立并可以运行。在我的一个已经使用了很长时间的应用程序中,迁移似乎很困难,因此,我急着做了以下事情:
rm -r */migrations/*
rm db.sqlite3
python3 manage.py makemigrations
No changes detected
哇?
我错误地还删除了所有__init__.py
文件:(-进入后,一切又恢复正常了:
touch ads1/migrations/__init__.py
对于我的每个应用程序,都可以makemigrations
再次使用。
事实证明,我已经手动通过复制另一个创建了一个新的应用程序,忘了把__init__.py
中migrations
文件夹和confinved我,一切都是靠不住的-我的领先使得它与更坏rm -r
如上所述。
希望这可以帮助某人在几个小时内发誓“未检测到更改”错误。
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博客或您的应用名称
您可能还会遇到的一个非常愚蠢的问题是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")]
我知道这是一个老问题,但是我整天都在同一个问题上作斗争,而我的解决方案很简单。
我的目录结构类似于...
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页。
希望这对某人有帮助!
根据官方文档中的“迁移”部分,我在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, ...)
解决了这个愚蠢的错误,使用这些命令可以顺利进行迁移。也许这可以帮助某人。
可能的原因可能是删除了现有的db文件和migrations文件夹,您可以使用python manage.py makemigrations <app_name>
来工作。我曾经遇到过类似的问题。
将新模型添加到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
│ └── ...
您可以做的最好的事情是,删除现有数据库。就我而言,我使用的是phpMyAdmin SQL数据库,因此我手动删除了上面创建的数据库。
删除后: 我在PhpMyAdmin中创建数据库,并且不添加任何表。
再次运行以下命令:
python manage.py makemigrations
python manage.py migrate
这些命令之后:您可以看到django在数据库中自动创建了其他必要的表(大约有10个表)。
python manage.py makemigrations <app_name>
python manage.py migrate
最后:在上述命令之后,您创建的所有模型(表)都将直接导入数据库。
希望这会有所帮助。
创建一个名为的新应用时,我遇到了另一个问题deals
。我想在该应用中分离模型,所以我有2个名为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