[英]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.