PostgreSQL数据库中带有唯一字段的Django South迁移错误

Django south migration error with unique field in postgresql database

编辑:我理解发生这种情况的原因。这是因为存在初始的data.json文件。令人欣慰的是,南方希望在迁移后添加这些设备,但由于一个字段的独特属性而失败。

你好,

我改变了我的模型:

1
2
3
4
5
6
    class Setting(models.Model):
        anahtar = models.CharField(max_length=20,UNIQUE=TRUE)
        deger = models.CharField(max_length=40)

        def __unicode__(SELF):
            RETURN SELF.anahtar

对此,

1
2
3
4
5
6
    class Setting(models.Model):
        anahtar = models.CharField(max_length=20,UNIQUE=TRUE)
        deger = models.CharField(max_length=100)

        def __unicode__(SELF):
            RETURN SELF.anahtar

架构迁移命令已成功完成,但尝试迁移时出现以下错误:

完整性错误:重复的键值违反了唯一约束"blog_setting_anahtar_key"

detail:key(anahtar)=(blog_baslik)已经存在。

我想保持该字段的唯一性,但仍要迁移该字段。顺便说一下,只要数据库中的其他表保持不变,该表上的数据丢失是可以接受的。


实际上,同步数据库的默认行为是每次运行初始的data.json。来自Django文档:

If you create a fixture named initial_data., that fixture will be loaded every time you run syncdb. This is extremely convenient, but be careful: remember that the data will be refreshed every time you run syncdb. So don't use initial_data for data you'll want to edit.

参见:文档

就个人而言,我认为每次发生更改时都需要重新加载的初始数据的用例是延迟的,因此我从不使用initial_data.json。

由于您使用的是South,所以更好的方法是在迁移所需的特定fixture上手动调用loadData。在初始数据的情况下,这将进入您的0001_initial.py迁移。

1
2
3
def forwards(SELF, orm):
    FROM django.core.management import call_command
    call_command("loaddata","my_fixture.json")

参见:http://south.aeracode.org/docs/fixtures.html

另外,请记住,到fixture的路径是相对于项目根目录的。因此,如果您的设备位于"myproject/myapp/fixtures/my洹fixture.json"call_command中,则实际看起来如下:

1
call_command('loaddata', 'myapp/fixtures/my_fixture.json')

当然,您的fixture不能命名为"initial_data.json",否则,默认行为将接管。