2016-01-09 30 views
8

Próbuję uruchomić migrację dla mojego projektu Django, ale dostaję błąd:obiekt „ManyToManyField” nie ma atrybutu „m2m_reverse_field_name”

AttributeError: 'ManyToManyField' object has no attribute 'm2m_reverse_field_name' 

I kiedy wpadłem dokonać migracji na wszystkich moich aplikacje, nie dostałem żadnych błędów. To tylko wtedy, gdy próbuję faktycznie migrować. Nie mogę stwierdzić na podstawie informacji o śledzeniu, który model powoduje problem, a nawet jakiej aplikacji. Spojrzałem na moje modele i nie widziałem niczego, co wyskakuje na mnie.

Oto ślad stosu:

Operations to perform: 
    Apply all migrations: admin, sessions, case_manager, file_manager, auth, contenttypes, tasks, people_and_property 
Running migrations: 
    Rendering model states... DONE 
    Applying file_manager.0006_auto_20160109_1536...Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/django/core/management/__init__.py", line 350, in execute_from_command_line 
    utility.execute() 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/django/core/management/__init__.py", line 342, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/django/core/management/base.py", line 348, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/django/core/management/base.py", line 399, in execute 
    output = self.handle(*args, **options) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 200, in handle 
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/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 "/home/mint/Python_Projects/venv/lib/python3.4/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 "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/django/db/migrations/executor.py", line 198, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/django/db/migrations/migration.py", line 123, in apply 
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/django/db/migrations/operations/fields.py", line 201, in database_forwards 
    schema_editor.alter_field(from_model, from_field, to_field) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 467, in alter_field 
    return self._alter_many_to_many(model, old_field, new_field, strict) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/django/db/backends/sqlite3/schema.py", line 274, in _alter_many_to_many 
    old_field.remote_field.through._meta.get_field(old_field.m2m_reverse_field_name()), 
AttributeError: 'ManyToManyField' object has no attribute 'm2m_reverse_field_name' 

Jak mogę dowiedzieć się, który model jest problem? Na co powinienem zwrócić uwagę?

+0

pojawia się ten błąd po zmianach w niektórych modelach? –

+0

Wprowadziłem kilka drobnych zmian. Naprawdę próbowałem wrócić i zmienić je tak, jak były, ale nie wydaje się to mieć znaczenia. Nie robię nic nadzwyczajnego, dosłownie tylko pola ManytoMany z related_name. – jejy2343

+0

Czy możesz wyświetlić pełną definicję pola? –

Odpowiedz

4

Wpadłem na ten sam problem, ale nie wiem, czy z tych samych powodów. Na szczęście nie mam żadnych ważnych danych w systemie, więc zmieniłem migrację w następujący sposób - , ale zauważ, że to usuwa wszystkie dane w tych kolumnach!

Przed:

operations = [ 
    migrations.AlterField(
     model_name='resource', 
     name='authors', 
     field=models.ManyToManyField(related_name='resources_authored', to='api.Person'), 
    ), 
    migrations.AlterField(
     model_name='resource', 
     name='editors', 
     field=models.ManyToManyField(blank=True, related_name='resources_edited', to='api.Person'), 
    ), 
] 

Po:

operations = [ 
    migrations.RemoveField(
     model_name='resource', 
     name='authors', 
    ), 
    migrations.RemoveField(
     model_name='resource', 
     name='editors', 
    ), 
    migrations.AddField(
     model_name='resource', 
     name='authors', 
     field=models.ManyToManyField(related_name='resources_authored', to='api.Person'), 
    ), 
    migrations.AddField(
     model_name='resource', 
     name='editors', 
     field=models.ManyToManyField(blank=True, related_name='resources_edited', to='api.Person'), 
    ), 
] 

Choć przerabianie nie powiodło się dla tajemniczych powodów, usunięcie i ponowne pola pracował.

+0

Czy to nie usunie wszystkich danych, które mogły być przechowywane w tych polach? – Brachamul

+0

@Brachamul, tak. To właśnie mam przez na myśli: "Na szczęście nie mam żadnych ważnych danych w systemie, więc po prostu zmieniłem migrację w następujący sposób." Zmienię to i wyjaśnię. –

+0

Następujące odpowiedzi @Sagar i jsep są znacznie bardziej przydatne – TauPan

2

Jedną z przyczyn może być Twoja migracja modelu api.Person mogła nie zostać przeprowadzona przed tą, do której się ona odnosi (w twoim przykładzie jest to file_manager.0006_auto_20160109_1536). Upewnij się więc, że migracje api.Person są uruchamiane wcześniej, dodając je w zależnościach od file_manager.0006_auto_20160109_1536.

+0

To właśnie spowodowało i rozwiązało to dla mnie. Dodałem zależność do migracji w następujący sposób: 'dependencies = [..., ('api', '__first__'),]'. Po tym AlterField działał. – Brachamul

+0

@Brachamul może powinieneś przyjąć tę odpowiedź? – TauPan

+0

Nie jestem tym, który zadał pytanie, więc nie mogę przyjąć odpowiedzi? – Brachamul

0

Miałem ten sam problem, gdy próbowałem zmienić nazwę tabeli, której dotyczyło wiele do wielu pól. postanowiłem to w ten sposób: - wyrzucił manytomany danych relacji do pliku - usunięty z boiska manytomany i migracji - przemianowany na stół i migracji - dodał pole manytomany powrotem i migracji i ładowane relacje z wysypiska

6

Musisz upewnić się, że model, który tworzysz "ManyToManyField", jest już utworzony w bazie danych.

Można to zrobić poprzez dodanie jako zależność migracji gdzie model jest stworzony do migracji, w którym zmiany na murawę:

Scenariusz 1: można zmieniać boiska „ManyToManyField” z modelem z innych Aplikacja

class Migration(migrations.Migration): 

    dependencies = [ 
     .......... 
     ('[app]', '__first__'), 
    ] 

    operations = [ 
     ......... 
    ] 

Scenariusz 2: tworzenie 'ManyToManyField' i model masz na myśli w tym samym pliku:

class Migration(migrations.Migration): 

    dependencies = [ 
     .......... 
    ] 

    operations = [ 
     ......... 
     # Make sure the model you are making the reference with is before the ManyToManyField 
     migrations.CreateModel(...) , 
     migrations.AlterField/CreateField(...) 

    ] 
0

miałem również ten sam p ROBLEM, ale sposób, że naprawiłem go, jest następujące kroki: Nota: Stracisz danych z tego ManyToManyField

python manage.py makemigrations app_name 
python manage.py migrate app_name --fake 

Nie zapomnij --fake

po tym. Usunąłem (lub po prostu skomentowałem wiersz) pole ManyToMany, a następnie makemigrations app_name, migracja app_name.

Na tym etapie wyczyszczono tę kolumnę z bazy danych, co należy teraz zrobić, aby ponownie dodać pole ManyToManyField, więc po makemigrations app_name & ponownie migrować app_name. Serwer może działać idealnie

To nie jest najlepsze, ale zadziałało. mam nadzieję, że to pomoże!

Powiązane problemy