2011-08-17 121 views
6

你能幫我理解爲什麼這段代碼會導致重複條目(IntegrityError)嗎?Django - get_or_create不起作用

我在Django 1.2上。

(row, is_new) = MyModel.objects.get_or_create(field1=1) 
row.other_field = 2 
row.save() 

我對field1有一個唯一的約束。如果有一行where field1 = 1,一切正常,Django做了一個「get」。

如果沒有一行where field1 = 1,它看起來像Django正在創建該行是正確的。但爲什麼它不讓我保存呢?

更新:

如果有幫助,這裏是爲MyModel:

class MyModel(models.Model): 
    id = models.BigIntegerField(primary_key=True) 
    field1 = models.BigIntegerField(unique=True) 
    other_field = models.CharField(max_length=765) 
    class Meta: 
     db_table = u'project_crosses_suppl_FO' 

FIELD1是一個外鍵到另一個表。但是我沒有在Django中爲該表製作模型,所以我不告訴Django這是一個外鍵。

+0

確實爲MyModel有洋場?你可以發佈MyModel的代碼嗎? –

+1

[This similar question](http://stackoverflow.com/questions/6974463/django-get-or-create-raises-duplicate-entry-with-together-unique)可能會幫助你。 – agf

+0

@agf。我不明白在這個問題上的決議是什麼,或者這個問題是如何合理的。這聽起來像是一個bug。我想我會放棄get_or_create並做一些工作:-( – Greg

回答

3

get_or_create給我聽到的聲音。我只是在做這項工作圍繞:

rows = MyModel.objects.filter(field1=1) 
row = rows[0] if rows else MyModel(field1=1) 
row.other_field = 2 
row.save() 
7

假設這是你真正的代碼一個合理的忠實代表,這並不奇怪它不是Django的多數民衆贊成破獲,這是你的模型。

您已使用自己的id字段覆蓋自動主鍵字段,但忽略將其設爲自動增量。所以數據庫沒有使用PK的新值,因此完整性錯誤。

除非你有一個非常好的理由,否則你應該讓Django處理PK領域本身。

+1

哦,這是一個好點,它是一個現有的表,我不能改變。爲什麼我要告訴Django什麼是主鍵,那麼我該怎麼改變呢?MySQL表中的列「id」實際上被設置爲自動增量,我是否需要告訴Django它是一個自動增量字段? – Greg

+0

@Greg,你已經試過了嗎? – Kirill

1

即使您使用的字段設置爲主鍵或唯一字符,獲取或創建也會返回結果元組。

所以你的情況:行是一個對象的元組,因此這應該爲你工作:

(row, is_new) = MyModel.objects.get_or_create(field1=1) 
row[0].other_field = 2 
row[0].save()