問題:シグナル受信者が特定の条件に対してモデルエントリが存在するかどうかを確認し、存在しない場合は新しいエントリを作成します。まれに、エントリが重複しています。レシーバ関数内重複要求スレッドがDjangoモデルの重複したデータベースエントリを作成します
:
try:
my_instance = MyModel.objects.get(field1=value1, field2=sender)
except:
my_instance = MyModel(field1=value1, field2=sender)
my_instance.save()
それはget_or_create
ヘルプを使用して、そのコードをクリーンアップするでしょうから脇get_or_create
のための明白な候補だが、この問題を防ぎますか?
信号はユーザーの操作の後に送信されますが、元の要求が複製されているとは思われません。これは他の操作をトリガーしたためです。
重複が何千回も発生しました。これは必然的に複数の要求によって引き起こされるのでしょうか、あるいは重複したスレッドを作成することができる方法はありますか?そして、重複を防ぐために、きめ細かなトランザクション管理を行う方法がありますか?
Apache2でDjango 1.1、Python 2.4、PostgreSQL 8.1、mod_wsgiを使用しています。
スレッドの安全に対処していないため、私の答えを削除しています。 'MyModel'が何らかの手段で作成された複製を取得した場合、' get'が 'MultipleObjectsReturned'例外を返した場合、複製は継続的に生成されます。 –