2011-08-13 78 views
1

编辑:我理解为什么发生这种情况。这是因为initial_data.json文件的存在。南方人希望在迁移之后添加这些装置,但由于场地的独特属性而失败。Django南迁移postgresql数据库中唯一字段的错误

嗨,

我改变了我的模型从这个:

 

    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_s etting_anahtar_key“

详情:Key(anahtar)=(blog_baslik)已经存在。

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

回答

1

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

If you create a fixture named initial_data.[xml/yaml/json], 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.

参见:https://docs.djangoproject.com/en/dev/howto/initial-data/#automatically-loading-initial-data-fixtures

我个人认为,用例的初始数据,需要每一个变化发生时是推迟时间重新加载,所以我从来没有使用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 /灯具/ my_fixture.json” call_command实际上是这样的:

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

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