2013-09-03 11 views
7

イムを失敗:DjangoのForeignKeyの中で、ユーザにモデルを移行するには、私のDjangoのモデルを移行しようとし

from django.contrib.auth.models import User 


class Post(models.Model): 
    headline = models.CharField(max_length=200) 
    slug = models.SlugField(max_length=200) 
    body = models.TextField(blank=True, null=True) 
    author = models.ForeignKey(User, null=True, blank=True) 

私がモデルを作成した後、私は著者のフィールドを追加しました。ここで

は、移行Djangoは作成している:私は./manage.py移行を実行しようとすると、ここで

# encoding: utf8 
from django.db import models, migrations 


class Migration(migrations.Migration): 

    dependencies = [('articles', '0002_auto')] 

    operations = [ 
     migrations.AddField(
      field = models.ForeignKey(to_field=u'id', to=u'auth.User', blank=True, null=True), 
      name = 'author', 
      model_name = 'post', 
     ), 
    ] 

は私のトレースバックです:

Operations to perform: 
    Synchronize unmigrated apps: ckeditor, sessions, admin, messages, auth, staticfiles, contenttypes, django_extensions 
    Apply all migrations: articles 
Synchronizing apps without migrations: 
    Creating tables... 
    Installing custom SQL... 
    Installing indexes... 
Installed 0 object(s) from 0 fixture(s) 
Running migrations: 
    Applying articles.0002_post_author...Traceback (most recent call last): 
    File "./manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/core/management/__init__.py", line 397, in execute_from_command_line 
    utility.execute() 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/core/management/__init__.py", line 390, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/core/management/base.py", line 242, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/core/management/base.py", line 289, in execute 
    output = self.handle(*args, **options) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/core/management/commands/migrate.py", line 116, in handle 
    executor.migrate(targets, plan, fake=options.get("fake", False)) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/migrations/executor.py", line 60, in migrate 
    self.apply_migration(migration, fake=fake) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/migrations/executor.py", line 73, in apply_migration 
    migration.apply(project_state, schema_editor) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/migrations/migration.py", line 80, in apply 
    operation.database_forwards(self.app_label, schema_editor, project_state, new_state) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/migrations/operations/fields.py", line 22, in database_forwards 
    schema_editor.add_field(from_model, to_model._meta.get_field_by_name(self.name)[0]) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/backends/schema.py", line 349, in add_field 
    definition, params = self.column_sql(model, field, include_default=True) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/backends/schema.py", line 105, in column_sql 
    db_params = field.db_parameters(connection=self.connection) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/models/fields/related.py", line 1285, in db_parameters 
    return {"type": self.db_type(connection), "check": []} 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/models/fields/related.py", line 1276, in db_type 
    rel_field = self.related_field 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/models/fields/related.py", line 1183, in related_field 
    return self.foreign_related_fields[0] 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/models/fields/related.py", line 971, in foreign_related_fields 
    return tuple(rhs_field for lhs_field, rhs_field in self.related_fields) 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/models/fields/related.py", line 958, in related_fields 
    self._related_fields = self.resolve_related_fields() 
    File "/home/USER/.virtualenvs/PROJECT/src/django-trunk/django/db/models/fields/related.py", line 943, in resolve_related_fields 
    raise ValueError('Related model %r cannot been resolved' % self.rel.to) 
ValueError: Related model u'auth.User' cannot been resolved 

誰もが私が間違ってやっているか知っていますか?

+0

あなたは運をこれで解決しましたか? – Andrei

+1

上記のコードはDjango 1.7 Alphaです。私は、Django 1.7.1で組み込みの移行を使用するのではなく、Django 1.6.1とSouthを使用する方が簡単だと分かりました。 –

答えて

0

カスタムユーザーモデルを使用していない場合はおそらく問題ありませんが、常にget_user_model()を使用するか、ユーザークラスを参照するときは忘れずにしてください。また、のように、あまりにも、settings.AUTH_USER_MODEL作品を外部キーを定義するときにこのような状況で私を助けた何

class MyModel(models.Model): 
    person = models.ForeignKey(settings.AUTH_USER_MODEL) 
3

  1. __init__.py(/%prjname%/移行フォルダ以外のすべての移行ファイルを削除します。 )
  2. python manage.py makemigrations
  3. python manage.py migrate

正確な原因は不明ですが、コードパートナーによって生成されたファイルを使用しようとしましたが、うまくいかなかったのです。

1

これは、Djangoの別のファンキーな機能です。これは、数時間でわかりました。 https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#substituting-a-custom-user-modelによると:

を原因スワップ可能なモデルのためのDjangoの動的な依存関係の機能の制限のために、あなたは(通常0001_initialと呼ばれる)AUTH_USER_MODELによって参照モデルは、そのアプリの最初の移行に作成されていることを確認する必要があります。それ以外の場合は、依存関係の問題が発生します。

したがって、この問題を解決するには、カスタムユーザーモデルの作成を0001_initial.pyに置くことがベストな「きれいな」方法であり、単純に機能します。そして、それがLebedev Sergeyのdelete/makemigrationsのトリックが機能する本当の理由です。

+1

これを実際に達成する方法の小さなコード例を提供することがあります。さもなければ、あなたの最初の答えをおめでとう! – theWanderer4865

0

他のマイグレーションを適用した後でこの変更を行った場合は、マイグレーションフォルダー内の他のものをすべて削除してから、「python manage.py makemigrations」を実行する必要があります。それで、あなたがAUTH_USER_MODELのために使ったことが、あなたの最初の移行になります。

関連する問題