【问题标题】:Django - get_or_create not workingDjango - get_or_create 不起作用
【发布时间】:2011-08-17 18:13:26
【问题描述】:

你能帮我理解为什么这段代码会导致重复条目(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 这是一个外键。

【问题讨论】:

  • MyModel 有外域吗?可以发一下 MyModel 的代码吗?
  • This similar question 可能会对您有所帮助。
  • @agf。我不明白那个问题的解决方案是什么,或者这个问题是如何合理的。这对我来说听起来像是一个错误。我想我会放弃 get_or_create 并解决问题:-(
  • 您可以将字符域设置为整数吗?这行得通吗?

标签: python django django-models


【解决方案1】:

假设这是对您的真实代码的相当忠实的表示,不足为奇的不是 Django,而是您的模型。

您已经用自己的 id 字段覆盖了自动主键字段,但忽略了使其成为自动增量。所以数据库没有为 PK 使用新值,因此出现完整性错误。

除非你有很好的理由,否则你应该让 Django 自己处理 PK 字段。

【讨论】:

  • 哦,这很好。这是我无法更改的现有表。这就是为什么我要告诉 Django 主键是什么。那么我究竟要改变什么? MySQL 表中的“id”列实际上设置为自增。我需要告诉 Django 这是一个自增字段吗?
【解决方案2】:

get_or_create 对我来说听起来很糟糕。我只是在做这个工作:

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

【讨论】:

    【解决方案3】:

    即使您使用的字段设置为主键或唯一字段,Get 或 Create 也会返回结果元组。

    所以在你的情况下:row 是一个带有一个对象的元组,因此这应该适合你:

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

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 2018-05-12
      • 1970-01-01
      • 2011-12-20
      相关资源
      最近更新 更多