2011-08-17 88 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()