Django南迁移错误与postgresql数据库中的唯一字段

时间:2011-08-13 19:00:24

标签: django postgresql django-south

编辑:我理解为什么会这样。这是因为initial_data.json文件的存在。南方希望在迁移后添加这些装置,但由于场的独特属性而失败。

您好,

我改变了我的模型:


    class Setting(models.Model):
        anahtar = models.CharField(max_length=20,unique=True)
        deger = models.CharField(max_length=40)

        def __unicode__(self):
            return self.anahtar

对此,


    class Setting(models.Model):
        anahtar = models.CharField(max_length=20,unique=True)
        deger = models.CharField(max_length=100)

        def __unicode__(self):
            return self.anahtar

架构迁移命令已成功完成,但是,尝试迁移会出现此错误:

IntegrityError:重复键值违反唯一约束“blog_setting_anahtar_key”

详细信息:Key(anahtar)=(blog_baslik)已经存在。

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

1 个答案:

答案 0 :(得分:1)

这实际上是syncdb每次运行initial_data.json的默认行为。来自Django文档:

  

如果你创建一个名为initial_data。[xml / yaml / json]的灯具,每次运行syncdb时都会加载该灯具。这非常方便,但要小心:请记住,每次运行syncdb时都会刷新数据。所以不要将initial_data用于您想要编辑的数据。

请参阅:docs

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

更好的方法,因为您正在使用South,是在您迁移所需的特定夹具上手动调用loaddata。对于初始数据,这将在您的0001_initial.py迁移中进行。

def forwards(self, orm):
    from django.core.management import call_command
    call_command("loaddata", "my_fixture.json")

请参阅:http://south.aeracode.org/docs/fixtures.html

另外,请记住夹具的路径是相对于项目根目录的。所以,如果您的灯具位于“myproject / myapp / fixtures / my_fixture.json”call_command实际上看起来像:

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

当然,你的灯具不能命名为'initial_data.json',否则,默认行为将接管。