迁移时 Django FieldDoesNotExist 异常
Django FieldDoesNotExist exception when migrating
使用 Django 1.9。所以我试图迁移我的数据库但是我遇到了这个错误。我花了很多时间试图解决这个问题,但没有成功。如果有必要,我可以上传更多我的代码。这是错误:
C:\Users\James\Desktop\James\Work\django\homepgcom>python manage.py migrate
Operations to perform:
Apply all migrations: auth, interface, sessions, admin, contenttypes, userprofile
Running migrations:
Rendering model states... DONE
Applying interface.0002_auto_20160107_1635...Traceback (most recent call last):
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\django\db\models\options.py", line 580, in get_field
return self.fields_map[field_name]
KeyError: None
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\management\__init__.py", line 350, in execute_from_command_line
utility.execute()
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\core\management\__init__.py", line 342, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\core\management\base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\core\management\base.py", line 399, in execute
output = self.handle(*args, **options)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\core\management\commands\migrate.py", line 200, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\migrations\executor.py", line 92, in migrate
self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\migrations\executor.py", line 121, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\migrations\executor.py", line 198, in apply_migration
state = migration.apply(state, schema_editor)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\migrations\migration.py", line 123, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\migrations\operations\fields.py", line 201, in database_forwards
schema_editor.alter_field(from_model, from_field, to_field)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\backends\base\schema.py", line 482, in alter_field
old_db_params, new_db_params, strict)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\backends\sqlite3\schema.py", line 245, in _alter_field
self._remake_table(model, alter_fields=[(old_field, new_field)])
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\backends\sqlite3\schema.py", line 181, in _remake_table
self.create_model(temp_model)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\backends\base\schema.py", line 250, in create_model
to_column = field.remote_field.model._meta.get_field(field.remote_field.field_name).column
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\models\options.py", line 582, in get_field
raise FieldDoesNotExist('%s has no field named %r' % (self.object_name, field_name))
django.core.exceptions.FieldDoesNotExist: User has no field named None
非常感谢!
大约 五分钟 发布此消息后,我想出了一个解决方案。我想我会分享它,以防将来有人遇到这个问题。
- 删除所有应用的所有迁移
- 运行
python manage.py makemigrations <appname>
所有应用
- 然后迁移
python manage.py migrate
那应该就没问题了
感觉自己像个白痴,花了这么多时间试图解决这个问题,哦好吧!
对于 Django 的新手,很容易发现迁移在团队合作中存在问题 env.cause 损失的人正在修改模型并进行迁移有人做错了并导致 problem.If 它在开发环境中,删除迁移并重做初始步骤不是问题。
但是如果它在生产中 env.You 不能删除所有 migrations.If 你需要确保新的数据库有原始数据 ones.That 将需要很多时间比修复错误的迁移。
所以我想解决问题的正确方法是在 运行
时检查迁移文件手册
python manage.py migrate
如果出现错误,找到导致问题的字段或表,然后修改错误的迁移文件。
如果有
django.db.utils.OperationalError: (1050, "Table 'sometable'
already exists
Django Table already exist 将解决您的问题。
如果有
django.core.exceptions.FieldDoesNotExist: User has no field named None
这意味着您必须删除 migrats.AddField 或 AlterFields。
operations = [
migrations.AddField(
model_name='user',
name='user_current_plan_id',
field=models.IntegerField(blank=True, null=True),
),
]
如果有
Duplicate column name
你可以通过
修复它
对我来说,一旦发生错误,不是问题而是一系列问题。。冷静下来,通过修改错误的migrations文件来修复它比删除所有migrations并重新同步db数据更好。
使用 Django 1.9。所以我试图迁移我的数据库但是我遇到了这个错误。我花了很多时间试图解决这个问题,但没有成功。如果有必要,我可以上传更多我的代码。这是错误:
C:\Users\James\Desktop\James\Work\django\homepgcom>python manage.py migrate
Operations to perform:
Apply all migrations: auth, interface, sessions, admin, contenttypes, userprofile
Running migrations:
Rendering model states... DONE
Applying interface.0002_auto_20160107_1635...Traceback (most recent call last):
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\django\db\models\options.py", line 580, in get_field
return self.fields_map[field_name]
KeyError: None
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\management\__init__.py", line 350, in execute_from_command_line
utility.execute()
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\core\management\__init__.py", line 342, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\core\management\base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\core\management\base.py", line 399, in execute
output = self.handle(*args, **options)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\core\management\commands\migrate.py", line 200, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\migrations\executor.py", line 92, in migrate
self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\migrations\executor.py", line 121, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\migrations\executor.py", line 198, in apply_migration
state = migration.apply(state, schema_editor)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\migrations\migration.py", line 123, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\migrations\operations\fields.py", line 201, in database_forwards
schema_editor.alter_field(from_model, from_field, to_field)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\backends\base\schema.py", line 482, in alter_field
old_db_params, new_db_params, strict)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\backends\sqlite3\schema.py", line 245, in _alter_field
self._remake_table(model, alter_fields=[(old_field, new_field)])
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\backends\sqlite3\schema.py", line 181, in _remake_table
self.create_model(temp_model)
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\backends\base\schema.py", line 250, in create_model
to_column = field.remote_field.model._meta.get_field(field.remote_field.field_name).column
File "C:\Users\James\AppData\Local\Programs\Python\Python35\lib\site-packages\
django\db\models\options.py", line 582, in get_field
raise FieldDoesNotExist('%s has no field named %r' % (self.object_name, field_name))
django.core.exceptions.FieldDoesNotExist: User has no field named None
非常感谢!
大约 五分钟 发布此消息后,我想出了一个解决方案。我想我会分享它,以防将来有人遇到这个问题。
- 删除所有应用的所有迁移
- 运行
python manage.py makemigrations <appname>
所有应用 - 然后迁移
python manage.py migrate
那应该就没问题了
感觉自己像个白痴,花了这么多时间试图解决这个问题,哦好吧!
对于 Django 的新手,很容易发现迁移在团队合作中存在问题 env.cause 损失的人正在修改模型并进行迁移有人做错了并导致 problem.If 它在开发环境中,删除迁移并重做初始步骤不是问题。
但是如果它在生产中 env.You 不能删除所有 migrations.If 你需要确保新的数据库有原始数据 ones.That 将需要很多时间比修复错误的迁移。
所以我想解决问题的正确方法是在 运行
时检查迁移文件手册python manage.py migrate
如果出现错误,找到导致问题的字段或表,然后修改错误的迁移文件。
如果有
django.db.utils.OperationalError: (1050, "Table 'sometable' already exists
Django Table already exist 将解决您的问题。
如果有
django.core.exceptions.FieldDoesNotExist: User has no field named None
这意味着您必须删除 migrats.AddField 或 AlterFields。
operations = [
migrations.AddField(
model_name='user',
name='user_current_plan_id',
field=models.IntegerField(blank=True, null=True),
),
]
如果有
Duplicate column name
你可以通过
对我来说,一旦发生错误,不是问题而是一系列问题。。冷静下来,通过修改错误的migrations文件来修复它比删除所有migrations并重新同步db数据更好。