【问题标题】:Django south migration error with unique field in postgresql databaseDjango南迁移错误与postgresql数据库中的唯一字段
【发布时间】:2011-10-26 12:40:36
【问题描述】:

编辑:我理解发生这种情况的原因。这是因为 `initial_data.json` 文件的存在。显然,South 希望在迁移后添加这些固定装置,但由于字段的独特属性而失败。

我改变了我的模型:

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" 详细信息:密钥 (anahtar)=(blog_baslik) 已经 存在。

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

【问题讨论】:

    标签: django postgresql django-south


    【解决方案1】:

    每次运行initial_data.json实际上是syncdb的默认行为。来自 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')
    

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

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 2017-05-21
      • 2014-12-21
      • 2011-11-19
      • 2020-07-16
      相关资源
      最近更新 更多