2016-01-09 20 views
8

benim Django projesi için taşıma işlemi çalışıyorum, ama ben hatayı alıyorum:'ManyToManyField' nesne hiçbir özellik 'm2m_reverse_field_name'

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

Üzerinde göçler yapmak bitince Hepsi benim uygulamalar, herhangi bir hata almadım. Sadece göç etmeye çalıştığımda. Sorunu hangi modelin oluşturduğunu veya hangi uygulamayı oluşturduğunu söyleyemem. Modellerime baktım ve bana çıkan hiçbir şey göremiyorum.

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' 

Sorunun hangi modeli anlamaya nasıl: Burada

yığın izleme nedir? Ne aramalıyım?

+0

bazı modelinde değişikliklerden sonra bu hata alıyorum? –

+0

Birkaç küçük değişiklik yaptım. Aslında geri dönüp onları oldukları gibi değiştirmeye çalıştım ama fark yaratmıyor gibi görünüyor. Ben fantezi bir şey yapmıyorum, tam anlamıyla bir related_name ile sadece ManytoMany alanları. – jejy2343

+0

Tam alan tanımını gösterebilir misin? –

cevap

4

Aynı soruna rastladım ama aynı nedenlerden dolayı bilmiyorum. Neyse ki sistemde hiç önemli bir veri yok, bu yüzden yalnızca geçişi aşağıdaki gibi değiştirdim: Ancak, bu, bu sütunlardaki tüm verileri siler!

önce:

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'), 
    ), 
] 

sonra:

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'), 
    ), 
] 

değiştiren çıkarmadan ve alanlar çalışmış yeniden gizemli nedenlerle başarısız olsa da.

+0

Bu alanlarda saklanmış olabilecek tüm verileri silmeyecek miydi? – Brachamul

+0

@Brachamul, aye. Demek istediğim, “Neyse ki sistemde hiç önemli bir veri yok, bu yüzden geçişi aşağıdaki gibi değiştirdim.” Bunu daha net bir şekilde düzenleyeceğim. @Sagar ve jsep tarafından –

+0

aşağıdaki cevaplar çok – TauPan

2

Model geçişlerinizin nedeni api.Person10 olabilir. Model geçişleri, başvuruda bulunulmadan önce çalışmayabilir (örneğiniz file_manager.0006_auto_20160109_1536). Bu nedenle, api.Person geçişlerinin daha önce, file_manager.0006_auto_20160109_1536 bağımlılıklarına eklenerek çalıştığından emin olun.

+0

Bu benim için neden oldu ve çözüldü. Göçe olan bağımlılığı şöyle ekledim: 'bağımlılıklar = [..., ('api', '__first__'),]. Bundan sonra AlterField çalıştı. – Brachamul

+0

@Brachamul belki bu cevabı kabul etmeli, o zaman? – TauPan

+0

Soruyu soran ben değilim, bu yüzden cevabı kabul edemem? – Brachamul

0

Çok sayıda alana atıfta bulunulan bir tabloyu yeniden adlandırmaya çalıştığımda aynı sorunu yaşadım. Ben öyle çözüldü: - Bir dosya içine manytomany ilişki verilerini dampingli - manytomany alanını kaldırıldı ve göç ​​- tablosunu yeniden adlandırılır ve göç ​​- manytomany sahadan geri eklendi ve göç ve dökümü ilişkileri yüklenen

6

'ManyToManyField' yarattığınız modelin veritabanında zaten oluşturulduğundan emin olmanız gerekir.

Senaryo 1: Diğer bir model ile alan için 'ManyToManyField' değiştirmek

Sen bir bağımlılık olarak size alanını değiştiren hangi modeli göçe oluşturulur göç ekleyerek bunu yapabilir Uygulamanın

class Migration(migrations.Migration): 

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

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

Senaryo 2: bir 'ManyToManyField' ve aynı dosyada olduğu başvuruyorsunuz modeli oluşturmak:

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

Ben de aynı p vardı Nota: Örün, ama ben düzelttim yolu aşağıdaki adımlar olduğunu Sen

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

Bundan sonra --fake

unutma o ManyToManyField gelen verileri kaybedersiniz. kaldırdım (ya da sadece satır yorum) APP_NAME göç, daha sonra ManyToMany alanını ve makemigrations app_name.

Bu adımda, veritabanınızdaki bu sütunu temizlediniz, yapmanız gereken şey ManyToManyField'ı yeniden eklemektir, böylece uygulama_adı uygulamanız yeniden & uygulama nesnesini yeniden uyguladığınızda yeniden. Sunucu Bu en iyi değil mükemmel

çalıştırabilir, ancak benim için çalıştı. umarım yardımcı olacaktır!

İlgili konular