6

モデル:

class ListContext(models.Model):
    content = models.CharField(max_length=200, blank=True)

私は、south を使用してスキーマの移行を管理しています。

ここで、以前のモデルを次のモデルに変更します。

from django.contrib.contenttypes.models import ContentType

class ListContext(models.Model):
    content = models.ForeignKey(ContentType, blank=True, null=True)

移行の場合:

$ python manage.py schemamigration --auto page 
 ~ Changed field content on page.ListContext
 + Added index for ['content'] on page.ListContext
Created 0010_auto__chg_field_listcontext_content.py. You can now apply this migration with: ./manage.py migrate page

この時点まではすべて問題ありません。

$ python manage.py migrate page 
Running migrations for page:
 - Migrating forwards to 0010_auto__chg_field_listcontext_content.
 > page:0010_auto__chg_field_listcontext_content
FATAL ERROR - The following SQL query failed: ALTER TABLE "page_page_listcontext" ALTER
COLUMN "content_id" TYPE integer, ALTER COLUMN "content_id" DROP NOT NULL, ALTER COLUMN
"content_id" DROP DEFAULT;

The error was: column "content_id" cannot be cast to type integer

Error in migration: page:0010_auto__chg_field_listcontext_content

string から int へのキャスト中にエラーが発生したと推測できますが、これを回避して移行を完了するにはどうすればよいですか?

テーブルに格納されているデータを保持する必要はありません。

4

1 に答える 1

4

forwards 関数を手動で編集する場合:

列の名前を変更します。

db.rename_column('sometable', 'content', 'content_old')

次に、列を追加して戻します。

db.add_column('sometable', 'content', self.gf('django.db.models.fields.IntegerField')(default=0))

次に、id を検索して新しいフィールドを更新するクエリを実行します。

db.execute("""
  UPDATE sometable SET content =
  (SELECT FKTable.id FROM FKTable
  WHERE (FKTable.content = sometable.content_old AND
  sometable.content_old != '')
  OR (FKTable.content = 'none' AND sometable.content_old = '')) --Maybe cut the OR out
""")

次に、逆方向を適切に機能させるために、いくつかの凝ったことを行う必要があります。

于 2013-01-23T21:29:40.317 に答える