使用get_or_create的Django IntegrityError

时间:2012-05-11 16:57:24

标签: python mysql django

我遇到了Django的get_or_create问题,我在一些帖子中已经看到这个问题已经解释了它的MySQL问题,所以我跟着这篇文章 http://www.no-ack.org/2010/07/mysql-transactions-and-django.html

由于MySQL get_or_create的默认事务隔离,基本上说IntegrityError在同时创建对象时会返回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

1 个答案:

答案 0 :(得分:0)

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

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