首页 文章

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

提问于
浏览
1

编辑:我理解为什么会这样 . 这是因为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 回答

  • 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',否则,默认行为将接管 .

相关问题