0

私のdjango1.4アプリでは、南を使用してデータを移行しようとしています.postgres8.3を使用しています

django.contrib.auth.models.Userというフィールドを追加する必要があるMyCategoryモデルがありますcreator

クラスを変更し、フィールドを追加しました

from django.contrib.auth.models import User
class MyCategory(models.Model):
    name=models.CharField(unique=True,max_length=50)
    description=models.TextField(blank=True)
    creator = models.ForeignKey(User,null=True)#added
    slug=models.SlugField(editable=False)

走ったpython manage.py schemamigration myapp --auto

+ Added field creator on myapp.MyCategory ファイルを出力して作成した0003_auto__add_field_mycategory_creator.py

次に、すべての古いレコードに webapp のスーパーユーザーを作成者として持たせたかったので、データ移行を試みました

走ったpython manage.py datamigration myapp add_creator

これにより、次のように forwards メソッドを実装したファイル add_creator.py が出力されます (後で、デバッグ目的で print stmt を追加しました)。

def forwards(self, orm):
    from django.contrib.auth.models import User
    suser = User.objects.filter(is_superuser=True)[0]
    # I also tried User.objects.get(is_superuser=True)
    print 'suser=',suser,'of type=',type(suser)
    for category in orm.MyCategory.objects.all():
        category.creator = suser
        category.save()

次に、移行コマンドを実行しました

python manage.py migrate myapp

この出力ValueError

Running migrations for myapp:
 - Migrating forwards to 0004_add_creator.
 > myapp:0004_add_creator
suser= damon of type= <class 'django.contrib.auth.models.User'>
Error in migration: myapp:0004_add_creator
Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_manager(settings)
....
File "/usr/local/lib/python2.6/dist-packages/south/migration/migrators.py", line 57, in <lambda>
    return (lambda: direction(orm))
  File "/home/me/dev/python/django/myapp/migrations/0004_add_creator.py", line 14, in forwards
    category.creator = suser
  File "/home/me/Django-1.4/django/db/models/fields/related.py", line 366, in __set__
    self.field.name, self.field.rel.to._meta.object_name))
ValueError: Cannot assign "<User: damon>": "MyCategory.creator" must be a "User" instance.

ここで何が起こっているのかわかりません..printステートメントは、ユーザーがdamonタイプであることを示しています..他のタイプを期待していますか? 誰か助けてくれませんか?django.contrib.auth.models.Usersouth

4

1 に答える 1

8

django.contrib.authまず、データ移行を凍結する必要があります。これは、次の方法で実現できます。

python manage.py datamigration myapp add_creator --freeze auth

orm次に、辞書を介してオブジェクトを適切に参照する必要があります。

def forwards(self, orm):
    suser = orm['auth.User'].objects.filter(is_superuser=True)[0]
    print 'suser=',suser,'of type=',type(suser)
    for category in orm['myapp.MyCategory'].objects.all():
        category.creator = suser
        category.save()
于 2012-12-14T06:59:50.190 に答える