django迁移不可能,因为字段默认值中存在错误?

django迁移不可能,因为字段默认值中存在错误?,django,django-models,django-migrations,Django,Django Models,Django Migrations,我的一个django模型面临着一种奇怪的情况。 我将Django 1.10.3与python 3.5.2一起使用 模型如下所示(为清晰起见,简化): 我有创建模型并添加字段的初始迁移,该字段由django使用/manage.py makemigrations自动生成 我将这段代码提交到我的git repo,并将其部署到我的生产服务器,但实际没有使用该模型(我的数据库中没有Report对象)。 我刚刚发现这段代码不正确(),于是决定重写save() 但是当我将默认值从fieldA\u defaul

我的一个django模型面临着一种奇怪的情况。 我将Django 1.10.3与python 3.5.2一起使用

模型如下所示(为清晰起见,简化):

我有创建模型并添加字段的初始迁移,该字段由django使用
/manage.py makemigrations
自动生成

我将这段代码提交到我的git repo,并将其部署到我的生产服务器,但实际没有使用该模型(我的数据库中没有
Report
对象)。 我刚刚发现这段代码不正确(),于是决定重写
save()

但是当我将默认值从
fieldA\u default
更改为
0
时,运行
/manage.py makemigrations
失败,因为它尝试运行旧的默认值函数
fieldA\u default
。在尝试了几个选项之后,我最终决定完全删除该模型。但这也不起作用,因为
makemigrations
仍在尝试运行相同的函数

以下是我删除模型时对
makemigrations
的回溯:

Traceback (most recent call last):
  File "./manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
    utility.execute()
  File "venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 359, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "venv/lib/python3.5/site-packages/django/core/management/base.py", line 294, in run_from_argv
    self.execute(*args, **cmd_options)
  File "venv/lib/python3.5/site-packages/django/core/management/base.py", line 345, in execute
    output = self.handle(*args, **options)
  File "venv/lib/python3.5/site-packages/django/core/management/commands/makemigrations.py", line 95, in handle
    loader = MigrationLoader(None, ignore_no_migrations=True)
  File "venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 52, in __init__
    self.build_graph()
  File "venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 197, in build_graph
    self.load_disk()
  File "venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 108, in load_disk
    migration_module = import_module("%s.%s" % (module_name, migration_name))
  File "venv/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 665, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "xxx/reporting/migrations/0001_initial.py", line 9, in <module>
    class Migration(migrations.Migration):
  File "xxx/reporting/migrations/0001_initial.py", line 22, in Migration
    ('fieldA', models.IntegerField(default=reporting.models.Report.fieldA_default)),
AttributeError: module 'reporting.models' has no attribute 'Report'
回溯(最近一次呼叫最后一次):
文件“/manage.py”,第22行,在
从命令行(sys.argv)执行命令
文件“venv/lib/python3.5/site packages/django/core/management/_init__.py”,第367行,从命令行执行
utility.execute()
文件“venv/lib/python3.5/site packages/django/core/management/__init__.py”,第359行,在execute中
self.fetch_命令(子命令)。从_argv(self.argv)运行_
文件“venv/lib/python3.5/site packages/django/core/management/base.py”,第294行,运行于_argv
self.execute(*args,**cmd_选项)
文件“venv/lib/python3.5/site packages/django/core/management/base.py”,第345行,执行
输出=self.handle(*args,**选项)
文件“venv/lib/python3.5/site packages/django/core/management/commands/makemigrations.py”,第95行,在handle中
loader=MigrationLoader(无,忽略\u无\u migrations=True)
文件“venv/lib/python3.5/site packages/django/db/migrations/loader.py”,第52行,在__
self.build_图()
文件“venv/lib/python3.5/site packages/django/db/migrations/loader.py”,第197行,内置图
self.load_disk()
文件“venv/lib/python3.5/site packages/django/db/migrations/loader.py”,第108行,装入磁盘
迁移\模块=导入\模块(“%s.%s”%(模块\名称,迁移\名称))
文件“venv/lib/python3.5/importlib/_init__.py”,第126行,在导入模块中
return _bootstrap._gcd_import(名称[级别:],包,级别)
文件“”,第986行,在_gcd_import中
文件“”,第969行,在“查找”和“加载”中
文件“”,第958行,在“查找”和“加载”中解锁
文件“”,第673行,在“加载”中
exec_模块中第665行的文件“”
文件“”,第222行,在已删除帧的调用中
文件“xxx/reporting/migrations/0001_initial.py”,第9行,在
类迁移(migrations.Migration):
文件“xxx/reporting/migrations/0001_initial.py”,第22行,迁移中
('fieldA',models.IntegerField(默认值=reporting.models.Report.fieldA_默认值)),
AttributeError:模块“reporting.models”没有属性“Report”
我有几个问题:

  • 为什么Django即使在删除模型的时候也要运行这个“旧”代码
  • 我是如何在没有Django对我大喊大叫的情况下将这段无效代码迁移到迁移中的
  • 我如何才能修复这种情况,使我的生产服务器不会损坏?我完全放弃模型并重建它没有问题,但我似乎不被允许这样做
为什么Django即使在删除模型的时候也要运行这个“旧”代码

因为模型及其方法仍在迁移文件
0001_initial.py

但是当我将默认值从fieldA_default更改为0时,运行./manage.py makemigrations失败,因为它尝试运行旧的默认值函数fieldA_default

我假设,在重置字段的默认值后,您删除了-现在已过时-方法
fieldA\u default
。如上所述,初始迁移中引用了该方法,现在该方法将被中断

我是如何在没有Django对我大喊大叫的情况下将这段无效代码迁移到迁移中的

创建迁移时,代码不是无效的。模型上的某些更改无法通过简单的正向迁移来处理。就你而言:

  • 在迁移文件中引用和导入模型时删除模型(迁移文件本身只是另一个python模块,不能只导入不存在的类)

  • 删除默认方法的步骤相同

当模型代码混乱或与迁移/db不同步,并且
makemigrations
在当前状态下无法工作时,可以执行以下操作:

  • python manage.py migrate app_name zero#撤消app的所有现有迁移
  • 从应用程序中删除所有迁移文件。或者,如果数据库中已有有价值的数据,则可以逐个撤消这些数据,并查看步骤3中是否有。已经起作用了

  • python manage.py makemigrations应用程序_name#全新开始

  • 这在开发过程中很容易,可以被视为迁移挤压的替代方法,但如果数据库中已经有生产数据,这显然是最后的手段。但在这种情况下,无论如何都应该谨慎和考虑地应用模型更改:)

  • 从迁移中手动删除要报告的所有引用
  • 从数据库中删除报表表
  • 运行python manage.py makemigrations。它将为报表创建新的迁移
  • 推,部署

  • 您是否尝试过将应用程序迁移到零、删除迁移并再次运行
    makemigrations
    ?我需要调试信息,请进入您的db表django_migrations并检查您的应用程序是否存在“0001_initial”行。将此添加到y
    Traceback (most recent call last):
      File "./manage.py", line 22, in <module>
        execute_from_command_line(sys.argv)
      File "venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
        utility.execute()
      File "venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 359, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "venv/lib/python3.5/site-packages/django/core/management/base.py", line 294, in run_from_argv
        self.execute(*args, **cmd_options)
      File "venv/lib/python3.5/site-packages/django/core/management/base.py", line 345, in execute
        output = self.handle(*args, **options)
      File "venv/lib/python3.5/site-packages/django/core/management/commands/makemigrations.py", line 95, in handle
        loader = MigrationLoader(None, ignore_no_migrations=True)
      File "venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 52, in __init__
        self.build_graph()
      File "venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 197, in build_graph
        self.load_disk()
      File "venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 108, in load_disk
        migration_module = import_module("%s.%s" % (module_name, migration_name))
      File "venv/lib/python3.5/importlib/__init__.py", line 126, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 986, in _gcd_import
      File "<frozen importlib._bootstrap>", line 969, in _find_and_load
      File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 665, in exec_module
      File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
      File "xxx/reporting/migrations/0001_initial.py", line 9, in <module>
        class Migration(migrations.Migration):
      File "xxx/reporting/migrations/0001_initial.py", line 22, in Migration
        ('fieldA', models.IntegerField(default=reporting.models.Report.fieldA_default)),
    AttributeError: module 'reporting.models' has no attribute 'Report'