Django + South - 迁移无法转换列类型 - 希望我使用"USING"

jon*_*omo 7 migration django postgresql django-south

我尝试运行时收到此错误./manage.py migrate my_app:

django.db.utils.ProgrammingError:列"关联"不能自动转换为类型integer
HINT:指定USING表达式以执行转换.

这听起来很棒,但我不知道南方希望我做什么.我应该手动编辑自动生成的python迁移文件吗?如果是这样,我怎么样 - 我没有看到该文件中的标准SQL.相反,我看到了这个:

# Changing field 'MyTable.associated'
db.alter_column(u'data_mytable', 'associated', 
    self.gf('django.db.models.fields.IntegerField')()
)
Run Code Online (Sandbox Code Playgroud)

另外,为什么南方没有接受这个并USING自动添加条款?

小智 7

这是我的肮脏黑客:

  1. 手动添加了一个migraton来删除offendig字段,即

migrations.RemoveField( model_name='name_of_the_model', name='offending_field', ) 然后我将抱怨迁移的操作从AlterField更改为AddField ie

migrations.AddField(
        model_name='name_of_model',
        name='name_of_field',
        field=models.ForeignKey(blank=True, null=True, to='ForeignKeyModel'),
        preserve_default=False,
    ),
Run Code Online (Sandbox Code Playgroud)

```


Sal*_*nzo 2

您必须用db.alter_column以下内容替换原始内容db.execute

# Changing field 'MyTable.associated'
# db.alter_column(u'data_mytable', 'associated', 
#     self.gf('django.db.models.fields.IntegerField')()
# )
db.execute(
    'ALTER TABLE "data_mytable" '
    'ALTER COLUMN "associated" DROP DEFAULT, '
    'ALTER COLUMN "associated" DROP NOT NULL, '
    'ALTER COLUMN "associated" TYPE INTEGER '
    'USING '
    'CASE '
    '  WHEN FALSE THEN 0 ELSE 1 '
    'END'
) 
Run Code Online (Sandbox Code Playgroud)

当然,WHEN条件可能会根据associated原始类型而改变。
另请参阅此链接