[英]Django - get_or_create not working
你能幫我理解為什么這段代碼會導致重復條目(IntegrityError)嗎?
我在 Django 1.2 上。
(row, is_new) = MyModel.objects.get_or_create(field1=1)
row.other_field = 2
row.save()
我確實對 field1 有一個獨特的約束。 如果存在 field1=1 的行,則一切正常,Django 執行“獲取”。
如果沒有 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 中為該表創建 model ,所以我沒有告訴 Django 它是外鍵。
假設這是您真實代碼的相當忠實的表示,毫不奇怪,被破壞的不是 Django,而是您的 model。
您已經用自己的id
字段覆蓋了自動主鍵字段,但忽略了使其成為自動增量。 因此數據庫沒有為 PK 使用新值,因此存在完整性錯誤。
除非您有非常好的理由,否則您應該讓 Django 自己處理 PK 字段。
get_or_create 對我來說聽起來很糟糕。 我只是在做這個工作:
rows = MyModel.objects.filter(field1=1)
row = rows[0] if rows else MyModel(field1=1)
row.other_field = 2
row.save()
即使您使用的字段設置為主鍵或唯一,Get 或 Create 也會返回結果元組。
所以在你的情況下: row 是一個帶有一個 object 的元組,因此這應該適合你:
(row, is_new) = MyModel.objects.get_or_create(field1=1)
row[0].other_field = 2
row[0].save()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.