2011-08-30 225 views
3

幫助!無法弄清楚這一點!即使使用默認參數集,get_or_create也會收到完整性錯誤。Django get_or_create引發重複主鍵的重複條目默認值

下面是模型的外觀。

class Example(models.Model):model 
    user   = models.ForeignKey(User) 
    text   = models.TextField() 

def __unicode__(self): 
    return "Example" 

我在Django運行此:

def create_example_model(user, textJson): 
    defaults = {text: textJson.get("text", "undefined")} 

    model, created = models.Example.objects.get_or_create(
      user=user, 
      id=textJson.get("id", None), 
      defaults=defaults) 

    if not created: 
     model.text = textJson.get("text", "undefined") 
     model.save() 

    return model 

我就get_or_create線得到一個錯誤:

IntegrityError: (1062, "Duplicate entry '3020' for key 'PRIMARY'") 

它是活的,所以我真的不能告訴什麼輸入是。

幫助?實際上有一個默認設置,所以它不是這個問題,他們沒有默認設置。再加上它沒有一起獨特。 Django : get_or_create Raises duplicate entry with together_unique

我正在使用python 2.6和mysql。

回答

1

你不應該一般設置對象的id,你必須小心這樣做。

您是否檢查過您要放入數據庫的'id'的值?

如果這不能解決您的問題,那麼它可能是一個數據庫問題,對於PostgreSQL有一個特殊的序列用於遞增ID,有時這不會增加。類似如下:

SELECT SETVAL( 'tablename_id_seq',(SELECT MAX(ID)+ 1 FROM tablename_id_seq));

+0

僅當ID已存在時才設置ID。如果id爲空,它將從數據庫自動生成(自動增量)。至少這就是我所理解的。 – Kenneth

2

get_or_create()將嘗試創建一個新的對象,如果不能找到一個,是一個準確匹配你傳遞參數。

那麼究竟是什麼我假設的情況是,一個不同的用戶已經創建了一個ID爲3020的對象。由於沒有使用用戶/ ID組合的對象,所以它會嘗試使用該組合創建一個新對象,但會失敗,因爲不同的用戶已經創建了一個物品ID爲3020.

希望這是有道理的。看看下面的回報。可能會對已發生的事情有一點了解。

models.Example.objects.get(id=3020) 

您可能需要在查找中生成3020個字符串。我假設一個字符串是從你的textJson.get()方法回來的。

+0

該對象存在於一個用戶下。併發請求可能會進入嗎? – Kenneth

+0

如果該對象已經存在,它將嘗試創建另一個對象(使用不同的用戶),但是您要分配的ID必須是唯一的。這就是你遇到錯誤的原因。與併發請求不應該有任何關係。 –