2012-02-01 16 views
0

具体的なモデルに変換している抽象モデルがあります。私は正常にスキーマを変更するために南を使用していますが、私はデータマイグレーションを使用することができません。南でデータを移行すると新しいモデルが動作しない

私の初期状態は次のとおりです。

class UserProfile(models.Model): 
    user = models.OneToOneField(User, primary_key=True, \ 
           related_name='profile') 
    class Meta: 
     abstract=True 
class SpecificProfile(UserProfile): 
    url = models.URLField() 

私の新しい状態は次のとおりです。

class UserProfile(models.Model): 
    user = models.OneToOneField(User, primary_key=True, \ 
           related_name='profile') 
class SpecificProfile(UserProfile): 
    user_profile = models.OneToOneField(UserProfile, parent_link=True) 
    url = models.URLField() 

マイスキーマの移行は、次のとおりです。

class Migration(SchemaMigration): 

    def forwards(self, orm): 
     # Renaming field 'SpecProfile.user_profile' 
     db.rename_column('specificprofile', 'user_id', 'user_profile_id') 

     # Adding model 'UserProfile' 
     db.create_table('userprofile', (
      ('user', self.gf('django.db.models.fields.related.OneToOneField')(related_name='profile', unique=True, primary_key=True, to=orm['auth.User'])), 
     )) 
     db.send_create_signal('myapp', ['UserProfile']) 

私がするために、南で生成されたファイルを編集しましたSpecificProfileの1つのフィールドの名前を変更する

今、データ移行プロセスでは、SpecificProfileごとに1つのUserProfileエントリを作成し、UserProfile.user_idSpecificProfile.user_profile_idに割り当てたいとします。

だから、私のデータ移行は前方です:

class Migration(DataMigration): 

    def forwards(self, orm): 
     for spec in orm.SpecificProfile.objects.all(): 
      user_profile = orm.UserProfile() 
      user_profile.user_id = spec.user_profile_id 
      user_profile.save() 

スクリプトがエラーなしで実行されますがのUserProfileテーブル内の任意の新しいエントリを作成しません。 orm.UserProfile()の代わりにUserProfile()を使用しますか?

アイデア?

答えて

0

SpecificProfile.user_profile_id以前は存在しなかったため、移行するデータはありません。あなたが実際にやりたいことは、user_profile.userspec.userに設定し、次にspec.user_profileuser_profileに設定します。あなたが最初の移行を完了したら

def forwards(self, orm): 
    for spec in orm.SpecificProfile.objects.all(): 
     user_profile = orm.UserProfile() 
     user_profile.user_id = spec.user_id 
     user_profile.save() 

     # Then, 
     spec.user_profile_id = user_profile.id 

はしかし、私はSpecificProfile.userはもう存在しないかなり確信しています。現在はUserProfileになっているため、南はそのフィールドを削除します。

+0

SpecificProfile.user_profile_idは、スキーママイグレーション後に存在するはずです。具体的には、SpecificProfile.user_idの名前をSpecificProfile.user_profile_idに変更します。上記の私のSchemamigrationコードを確認してください。この名前の変更は正常に動作しています。 私はあなたのコードをテストしましたが、そのような場合にはうまくいきませんでした。 – duduklein

+0

私の問題は、orm.SpecificProfile.objects.all()が空のリストを返すことです – duduklein

関連する問題