2012-05-11 7 views
0

ImはDjangoのget_or_createの問題を持って、私はすでにそのMySQLの問題は、私は基本的にget_or_createが返されることを述べている。このポスト http://www.no-ack.org/2010/07/mysql-transactions-and-django.htmlジャンゴIntegrityErrorはget_or_create

に従っていることexplaningいくつかの記事では、この問題を見てきましたMySQLのデフォルトのトランザクションアイソレーションREPEATABLE READのためにオブジェクトを同時に作成するときは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 
+0

ループでも使用しているコードを表示できますか? –

+0

'author.book_set.get_or_create(name = book)'を実行したときにどうなるか分かりません。私は個人的にそれをもっと明示的に行うでしょう: 'Book.objects.get_or_create(name = book、defaults = {'author':author})'またはそれに類するもの。正確なエラーを投稿できますか?役立つかもしれません。 – Stefano

答えて

0

である、あなたは、データベースに固有のものではないフィールドでget_or_createを使用しないでください。この問題を回避する方法の1つは、名前フィールドの一意性を強制することです。

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

申し訳ありません私は、私の実際のコードでは、それはちょうどサンプルだったが、一意のパラメータを追加することを忘れてしまった – Paulo

関連する問題