2016-01-08 12 views
7

Korzystanie z django 1.9. Próbuję przenieść moją bazę danych, ale napotykam ten błąd. Spędziłem wiele godzin próbując rozwiązać ten problem i nie odniosłem sukcesu. Mogę przesłać więcej kodu, jeśli jest to konieczne. Oto błąd:Wyjątek Django FieldDoesNotExist podczas migracji

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 

Wielkie dzięki z góry!

+0

ile masz aplikacji?I tu jest wyjątek 'FieldDoesNotExist: Użytkownik nie ma pola o nazwie Brak' Czy możesz napisać 'Model użytkownika', jeśli to zmienisz. Lub dowolny kod, w którym pracujesz z 'User' –

+0

Dzięki za komentarz, ale mam rozwiązanie! – ThankYOU

+0

cieszę się, że dla Ciebie :) –

Odpowiedz

2

Około pięć minut po zaksięgowaniu tego wymyśliłem rozwiązanie. Pomyślałem, że podzielę się nim na wypadek, gdyby ktoś miał ten problem w przyszłości.

  1. Usuń wszystkie migracje dla wszystkich aplikacji
  2. Uruchom dla wszystkich aplikacji
  3. Następnie migrować python manage.py migrate

Wtedy wszystko powinno być w porządku

Poczuj się jak totalny idiota do spędziłem tyle godzin próbując to naprawić, no cóż!

+4

mmm to może działać dla ciebie, ale nie możesz usunąć wszystkich migracji dla twojego projektu. – BlaShadow

+1

Bardzo złe rozwiązanie! Jeśli skrypty migracji są już w toku, będzie to złe lub będzie prowadzić do dalszych modyfikacji. – DhiaTN

+1

Zakładam, że jesteś nowy w Django. W bazie danych znajduje się tabela o nazwie 'django_migrations', która śledzi migracje wykonywane w bazie danych. W ten sposób django wie, które migracje są nowe i które należy wykonać. Jeśli usuniesz swoje migracje i utworzysz nowe, może to nie być problem na twoim komputerze, ponieważ możesz łatwo wyczyścić bazę danych i utworzyć nową. Ale jeśli masz działający serwer z aktywną bazą danych, musisz naprawić tabelę 'django_migration', która jest po prostu kiepską praktyką. Tak długo, krótko mówiąc, znajdź poprawkę zamiast czyścić migracje. – AliBZ

1

Dla każdego, kto jest nowy w Django, łatwo zauważyć, że migracja ma problem z przewodami w pracy zespołowej. Zagubione osoby modyfikują modele i wykonują migracje. Ktoś zrobił to źle i spowodował problem. Jeśli jest w systemie env, usuwanie migracji i ponawianie początkowego kroku nie stanowi problemu.

, ale jeśli znajduje się w środowisku produkcyjnym. Nie można usunąć wszystkich migracji.Jeśli to zrobisz, musisz upewnić się, że nowa baza danych zawiera dane o pochodzeniu.To zajmie dużo czasu, niż naprawienie błędnych migracji .

Więc myślę poprawny sposób, aby rozwiązać problem, to sprawdzić instrukcję plików migracje po uruchomieniu

python manage.py migrate

jeśli wystąpił błąd, znajdź pole lub tablice przyczyną problemu, a następnie zmodyfikować złego migracji plik.

Jeśli istnieje

django.db.utils.OperationalError: (1050, "Table 'sometable' already exists

Django Table already exist rozwiąże Twój problem.

Jeśli istnieje

django.core.exceptions.FieldDoesNotExist: User has no field named None

to znaczy, trzeba usunąć migrats.AddField lub AlterFields.

operations = [ 
    migrations.AddField(
     model_name='user', 
     name='user_current_plan_id', 
     field=models.IntegerField(blank=True, null=True), 
    ), 
] 

jeśli istnieje

Duplicate column name

można naprawić poprzez Duplicate column name

Dla mnie, gdy wystąpił błąd, a nie problem, ale seria questions..just uspokoić, i naprawić go, modyfikując złe pliki migracyjne, jest lepszym rozwiązaniem niż usuwanie wszystkich migracji i ponowna synchronizacja danych bazy danych.