python - migrations - Excepción de Django FieldDoesNotExist al migrar
python manage py make migrations (2)
Usando django 1.9. Así que estoy intentando migrar mi base de datos, sin embargo, me encuentro con este error. He pasado muchas horas tratando de solucionar este problema y no he tenido éxito. Puedo subir más de mi código si es necesario. Aquí está el error:
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
¡Muchas gracias de antemano!
Alrededor de cinco minutos después de publicar esto, se me ocurrió una resolución. Pensé que lo compartiría en caso de que alguien tenga este problema en el futuro.
- Eliminar todas las migraciones para todas tus aplicaciones
- Ejecute
python manage.py makemigrations <appname>
para todas las aplicaciones - A continuación, migre
python manage.py migrate
Entonces todo debería estar bien
Me siento como un idiota total por haber pasado tantas horas tratando de arreglar esto, ¡oh bien!
Para cualquier persona nueva en Django, es fácil encontrar que la migración ha provocado problemas en un entorno de trabajo en equipo. Las personas que pierden modifican los modelos y realizan las migraciones. Alguien lo hizo incorrectamente y causa el problema. Si está en dev env, elimine las migraciones y rehacer el paso inicial no es un problema.
pero si está en entorno de producción, no puede eliminar todas las migraciones. Si lo hace, debe asegurarse de que el nuevo db tenga los datos de los de origen. Esto llevará mucho tiempo antes que corregir las migraciones erróneas.
Así que supongo que la forma correcta de solucionar el problema es consultar el manual del archivo de migraciones cuando se ejecuta
python manage.py migrate
si ocurrió el error, encuentre que el campo o las tablas causan el problema, luego modifique el archivo de migración incorrecto.
Si hay un
django.db.utils.OperationalError: (1050, "Table ''sometable'' ya existe
Django Table ya existe solucionará tu problema.
Si hay un
django.core.exceptions.FieldDoesNotExist: el usuario no tiene un campo con nombre Ninguno
significa que tienes que eliminar los migrats.AddField o AlterFields.
operations = [
migrations.AddField(
model_name=''user'',
name=''user_current_plan_id'',
field=models.IntegerField(blank=True, null=True),
),
]
si hay un
Nombre de columna duplicado
puedes arreglarlo por nombre de columna duplicado
Para mí, una vez que se produjo el error, no es un problema sino una serie de preguntas ... simplemente tranquilízate y corrígelo modificando los archivos de migraciones incorrectos es una mejor manera que eliminar todas las migraciones y resincronizar los datos de db.