你能帮我理解为什么这段代码会导致重复输入(IntegrityError)吗?
我在使用Django 1.2。
(row, is_new) = MyModel.objects.get_or_create(field1=1)
row.other_field = 2
row.save()
我对field1有一个独特的约束。如果有一行field1 = 1,一切正常,Django做了“get”。
如果没有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 :(得分:7)
假设这是真实代码的合理忠实代表,毫不奇怪,它不是被破坏的Django,而是你的模型。
您已使用自己的id
字段覆盖自动主键字段,但忽略了使其成为自动增量。因此数据库没有为PK使用新值,因此存在完整性错误。
除非你有充分的理由,否则你应该让Django处理PK领域本身。
答案 1 :(得分: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()
答案 2 :(得分:1)
获取或创建会返回结果元组,即使您使用的字段设置为主键或唯一。
所以在你的情况下:row是一个带有一个对象的元组,因此这应该适合你:
(row, is_new) = MyModel.objects.get_or_create(field1=1)
row[0].other_field = 2
row[0].save()