2015-07-19 97 views
2

我的一個視圖的任務是將多個值插入到我的數據庫中。我的印象是,如果我建立我的模型具有獨特vendor_name S:使用Django和Postgresql的重複條目

class Page(models.Model): 
    vendor_name = models.CharField(max_length=128, unique=True) 
    website = models.CharField(max_length=128) 
    food_type = models.CharField(max_length=128) 
    img_url = models.CharField(max_length=128) 

,如果我做的:

for vendor in vendors: 
    c = Page(vendor_name=vendor["name"], 
      website=vendor["link"], 
      food_type=vendor["type"], 
      img_url=vendor["imageurl"]) 
    c.save() 

重複的出現將被跳過,而我就只有一個複製到數據庫中。至少這就是我從here瞭解的內容。而不是這樣做,我必須添加一個if語句檢查我的數據庫中的每個條目,並查看它是否當前在那裏,如果它不插入,否則跳過。或者我在這裏錯過了什麼?唯一約束的目的是什麼?是否只是在有重複時拋出錯誤?我可以利用這個呢?

我得到的錯誤是

Exception Value: duplicate key value violates unique constraint... 
+0

根據文檔:如果爲True,則該字段在整個表格中必須是唯一的。 這是在數據庫級別和模型驗證實施的。如果您嘗試在唯一字段中保存具有重複值的模型,則模型的save()方法將引發django.db.IntegrityError。 –

+0

爲什麼不使用外鍵代替,因爲似乎有一個Vendor模型 – Pynchia

+0

所以是的,它應該不會重複。你有沒有應用遷移? –

回答

1

在Django中,unique強制條目的數據庫級別的驗證,所以如果您添加屬性後,已經創建了表模型的領域,有着得天獨厚的條件將不即使您稍後在某個時間點執行syncdb,也會添加到您的表格中。

如果您不希望創建具有相同vendor_name行,你應該使用Page.objects.get_or_crate讓Django的創建與該供應商的名稱Page對象只有在不存在:

for vendor in vendors: 
    page, created = Page.objects.get_or_create(
     vendor_name=vendor['name'], 
     defaults={'website': vendor['link'], 
        'food_type': vendor['type'], 
        'img_url': vendor['imageurl']) 

    if created: 
     print('Page created: ', page) 
0

您有未遷移。您得到Exception Value: duplicate key value violates unique constraint這一事實意味着您在應用遷移之前需要清除數據庫中的重複項。您不能只添加已被違反的約束條件。

如果這是一個選項,請從數據庫中刪除整個表並嘗試再次應用您的遷移。如果這不是一個選項,則需要刪除重複項並在之後應用遷移。

未應用遷移unique將不起作用。