【问题标题】:Django IntegrityError with get_or_create带有 get_or_create 的 Django IntegrityError
【发布时间】:2012-05-11 16:57:23
【问题描述】:

我在使用 Django 的 get_or_create 时遇到了问题,我在一些帖子中看到了这个问题,已经解释了这是一个 MySQL 问题,所以我关注了这个帖子 http://www.no-ack.org/2010/07/mysql-transactions-and-django.html

这基本上是说get_or_create 将在并发创建对象时返回一个IntegrityError,因为 MySQL 的默认事务隔离为REPEATABLE READ

我按照帖子的建议做了,将transaction-isolation = READ-COMMITTED 添加到我的 /etc/mysql/my.cnf 文件,但得到了同样的错误。所以我想知道是否还有其他解决方案。

这是一个复制问题的示例模型

class Author(models.Model):
    name = models.CharField(max_length=100, unique=True)

class Book(models.Model):
    name = models.CharField(max_length=100, unique=True)
    author = models.ForeingKey(Author)

如果我有很长的作者和书籍清单,有些重复。我运行一个 forloop 来遍历每个作者/书,使用 get_or_create 创建或获取相应的对象,它会抛出一个 IntegrityError。

循环类似于..

authors = ['Author1', 'Author2', 'Author3', 'Author4', 'Author5']
books = ['book1', 'book2', 'book3', 'book4', 'book5']

for author, book in zip(authors, books):
    author = Author.objects.get_or_create(name=author)[0]
    author.book_set.get_or_create(name=book) # Error happens here

【问题讨论】:

  • 你能把你在循环中使用的代码也显示出来吗?
  • 我不确定当您执行author.book_set.get_or_create(name=book) 时会发生什么。我个人会更明确地这样做:Book.objects.get_or_create(name=book, defaults={'author':author}) 或类似的东西。你能发布你的确切错误吗?可能会有所帮助。

标签: python mysql django


【解决方案1】:

一般来说,您不应将get_or_create 与数据库中不唯一的字段一起使用。避免此问题的一种方法是强制名称字段的唯一性:

class Author(models.Model):
    name = models.CharField(max_length=100, unique=True)

【讨论】:

  • 对不起,我忘了添加唯一参数,在我的实际代码中我确实有它,这只是一个示例
猜你喜欢
  • 1970-01-01
  • 2018-02-12
  • 2018-02-19
  • 2011-01-18
  • 2018-02-17
  • 2011-09-16
  • 2017-03-17
  • 2016-12-01
  • 2015-11-02
相关资源
最近更新 更多