2017-05-16 3 views
0

私はジャンゴ1.9.13は、多くのモデルはAttributeErrorに多くの名前を変更することはできません:「ユニコード」

class ModelA(models.Model): 

class ModelB(models.Model): 
    manytomany = models.ManyToManyField(ModelA, through='ManyToManyModel') 

class ManyToManyModel(models.Model): 

にそれが最後の「s」は

class ModelA(models.Model): 

class ModelB(models.Model): 
    manytomany = models.ManyToManyField(ModelA, through='ManyToManyModels') 

class ManyToManyModels(models.Model): 

だ削除、多くのモデルに多くの名前を変更していますmakemigrationsを使って正しく移行を作成できます。モデルの名前を変更したかどうか尋ねられます。しかし、私が移行するとき、私はこのエラーを受け取ります:

./manage.py migrate 
    File "./manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/lib/python2.7/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line 
    utility.execute() 
    File "/lib/python2.7/site-packages/django/core/management/__init__.py", line 345, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/lib/python2.7/site-packages/django/core/management/base.py", line 399, in execute 
    output = self.handle(*args, **options) 
    File "/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 200, in handle 
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial) 
    File "/lib/python2.7/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 "/lib/python2.7/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 "/lib/python2.7/site-packages/django/db/migrations/executor.py", line 198, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "/lib/python2.7/site-packages/django/db/migrations/migration.py", line 123, in apply 
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
    File "/lib/python2.7/site-packages/django/db/migrations/operations/fields.py", line 201, in database_forwards 
    schema_editor.alter_field(from_model, from_field, to_field) 
    File "/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 465, in alter_field 
    old_field.remote_field.through._meta.auto_created and 
AttributeError: 'unicode' object has no attribute '_meta' 
+0

多分、Djangoのマイグレーションは 'through'引数への文字列の割り当てを好まないかもしれません。以前にスルーモデルを定義してから、 'through = ManyToManyModel'を書きましたか? – albar

+2

両方の変更を同時に行うため、移行が混乱することがあります。最初に 'ManyToManyModel'という2番目のモデルを作成し、移行が成功した場合は古いモデルを削除してください。 – Selcuk

答えて

0

私はこの答えをSelcukの答えに修正しました。

同じ移行ですべてを実行する代わりに、2つの移行に分けました。

最初のステップ。

新しいM2Mを作成したいと思います。

class ModelA(models.Model): 

class ModelB(models.Model): 
    manytomany = models.ManyToManyField(ModelA, through='ManyToManyModels') 

class ManyToManyModels(models.Model): 

class ManyToManyModel(models.Model): 

第2ステップ。

スルーフィールドを編集して新しいM2Mモデルを指し、古いM2Mを削除します。

class ModelA(models.Model): 

class ModelB(models.Model): 
    manytomany = models.ManyToManyField(ModelA, through='ManyToManyModel') 

class ManyToManyModel(models.Model): 
関連する問題