簡體   English   中英

帶有get_or_create的Django IntegrityError

[英]Django IntegrityError with get_or_create

我在Django的get_or_create上遇到問題,我已經在一些帖子中看到了這個問題,這些帖子已經說明了它是MySQL的問題,所以我關注了這篇文章http://www.no-ack.org/2010/07/mysql-transactions- and-django.html

基本上說,由於MySQL默認的REPEATABLE READ事務隔離,並發創建對象時get_or_create將返回IntegrityError

我按照帖子的建議進行操作,該操作是將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

通常,不應將get_or_create與數據庫中不唯一的字段一起使用。 避免此問題的一種方法是強制名稱字段的唯一性:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM