更新Django - 错误:'No module named migration'

14

我正在将我的Django应用从Django 1.5.5升级到1.9,Django-cms从2.4.3升级到3.3(以及所有相应的包)。

在我消除了所有弃用函数的错误之后,现在我遇到一个我无法理解的错误:“没有名为migration的模块”

当我在虚拟环境中运行以下命令时,会出现此错误: - python manage.py runserver 并且当我运行 - python manage.py migrate 时也会出现此错误。

Traceback (most recent call last):
  File "manage.py", line 20, in <module>
    execute_from_command_line(sys.argv)
  File "/var/www/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 350, in execute_from_command_line
    utility.execute()
  File "/var/www/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 342, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/var/www/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 195, in fetch_command
    klass = load_command_class(app_name, subcommand)
  File "/var/www/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 39, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/var/www/env/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 16, in <module>
    from django.db.migrations.autodetector import MigrationAutodetector
  File "/var/www/env/local/lib/python2.7/site-packages/django/db/migrations/__init__.py", line 1, in <module>
    from .migration import Migration, swappable_dependency  # NOQA
ImportError: No module named migration

管理.py

#!/usr/bin/env python2
import os
import sys

if __name__ == "__main__":

    settings_module_path = 'ais.settings.production'
    ########## Attempt to override settings using local settings
    try:
        from ais.settings.local_settings import *
        # For developmentent, file will probably hold the following:
        settings_module_path = 'ais.settings.development'
        print "!!!manage.py settings overwritten!!!"
    except ImportError:
        pass
    os.environ['DJANGO_SETTINGS_MODULE'] = settings_module_path

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

migrate.sh

#!/bin/sh
echo "Starting ..."

echo ">> Deleting old migrations"
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete


# Optional
echo ">> Deleting sqlite  (if exists) database"
find . -name "db.sqlite3" -delete

echo ">> Running manage.py makemigrations"
python manage.py makemigrations

echo ">> Running manage.py migrate"
python manage.py migrate

echo ">> Done"

2
你可以尝试在虚拟环境中卸载并重新安装Django吗? pip uninstall django && pip install django==1.11(或者你要升级到的任何版本)。 - YPCrumble
我已经做了……但是还是出现了相同的错误。 - A. Nurb
确保您正在使用正确的Django版本。在控制台中键入python -c“import django; print(django.get_version())”。那会产生什么?然后在虚拟环境激活时检查Python版本(python --version)。版本是多少?最后一件事,当您升级Django时,可能没有同时升级manage.py - 确保该文件的第一行是#!/usr/bin/env python - YPCrumble
如果以上都不起作用,请同时发布您的整个manage.py文件。 - YPCrumble
@YPCrumble 我找到了。我使用了一个脚本来重置迁移。请参见原问题底部的 migrate.sh。而且似乎这个脚本删除的不仅仅是迁移文件。 - A. Nurb
请确保您的虚拟环境目录不与'migrate.sh'脚本路径共存。可能的方法是将所有Django应用程序移动到'src'目录中,而migrate.sh仅应在'src'目录内容上运行。 - Ibrahim
7个回答

30

如果您的错误仍然像这样:

 from .migration import Migration, swappable_dependency  # NOQA
ImportError: No module named 'django.db.migrations.migration'

您需要重新安装 Django

检查您的 Django 版本,然后强制重新安装它

python -m django --version

使用命令pip install --upgrade --force-reinstall package可以更新并重新安装package。

  pip install --upgrade --force-reinstall  Django==2.0.5

20

你的脚本似乎存在问题。它试图删除你的迁移文件,但实际上也会删除 Django 中 /django/db/migrations/ 文件的内容。请注意,它明确不会删除 __init__.py 文件,但是会删除其他文件。

一种选择是仅删除这些行:

echo ">> Deleting old migrations" 
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete 
find . -path "*/migrations/*.pyc"  -delete

如果你在生产环境中使用Django,就不应该删除旧的迁移文件,因为你可能需要在迁移中添加自定义代码。这似乎是一个方便的开发脚本。


1
哈哈,不错啊,我在我的代码库中也遇到了虚拟环境的同样问题 :D - Simon Ninon
如果您正在使用virtualenv,这也会删除核心Django模块中的迁移。这将破坏项目,并需要重新安装Django才能修复它。不要使用通配符来删除旧的迁移。 - Danwand N S

5
正如@YPCrumble所指出的那样,您的“>> 删除旧迁移”脚本也删除了/django/db/migrations/文件。要恢复它,您需要卸载Django并重新安装。

正确。我也遇到了相同的问题。 pip install --upgrade --force-reinstall Django - Viraj Wadate

3

只需重新安装Django版本或升级版本。这解决了我的问题。

pip install --upgrade django==1.11.18

然后执行makemigrations。


2

您可能已经删除了迁移文件

在这种情况下,请尝试强制重新安装Django:

pip install --upgrade --force-reinstall  Django

1
Django模型有一个manage属性。它可以管理数据库表的创建与否。当manage为false时,不会创建数据库表;当manage为true时,会创建表。
Class User(models.Model):
    username = models.CharField(max_length=255)

    Class Meta:
        manage = False
        manage = True
  • 删除数据库并创建新的数据库。
  • 更新设置文件(数据库连接)。
  • 删除现有的迁移文件。
  • 创建新的迁移。
  • 运行新的迁移。

之前的评论很抱歉。评论已更新,现在它可以完美地工作。 - waruna k

0

尝试将您的virtualenv存储库放在项目之外。或者在不包括您的virtualenv存储库的路径中运行脚本。

或者您可以从查找路径中排除virtualenv存储库。请参阅如何在find .命令中排除目录


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接