django迁移不可能,因为字段默认值中存在错误?
我的一个django模型面临着一种奇怪的情况。 我将Django 1.10.3与python 3.5.2一起使用 模型如下所示(为清晰起见,简化): 我有创建模型并添加字段的初始迁移,该字段由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
/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对我大喊大叫的情况下将这段无效代码迁移到迁移中的
- 我如何才能修复这种情况,使我的生产服务器不会损坏?我完全放弃模型并重建它没有问题,但我似乎不被允许这样做
0001_initial.py
但是当我将默认值从fieldA_default更改为0时,运行./manage.py makemigrations失败,因为它尝试运行旧的默认值函数fieldA_default
我假设,在重置字段的默认值后,您删除了-现在已过时-方法fieldA\u default
。如上所述,初始迁移中引用了该方法,现在该方法将被中断
我是如何在没有Django对我大喊大叫的情况下将这段无效代码迁移到迁移中的
创建迁移时,代码不是无效的。模型上的某些更改无法通过简单的正向迁移来处理。就你而言:
- 在迁移文件中引用和导入模型时删除模型(迁移文件本身只是另一个python模块,不能只导入不存在的类)
- 删除默认方法的步骤相同
makemigrations
在当前状态下无法工作时,可以执行以下操作:
python manage.py migrate app_name zero#撤消app的所有现有迁移
python manage.py makemigrations应用程序_name#全新开始
您是否尝试过将应用程序迁移到零、删除迁移并再次运行
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'