2011-08-13 103 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」,否則默認行爲將接管。