Web APIからデータを読み取り、それをデータベースに配置するDjangoアプリケーションがあります。
モードから新しいオブジェクトを作成するが、オブジェクトがすでに存在する場合に重複例外を防ぐ方法はありますか?
言い換えれば、オブジェクトを保存する方法はありますが、オブジェクトがすでに存在する場合は何もしませんか?
Web APIからデータを読み取り、それをデータベースに配置するDjangoアプリケーションがあります。
モードから新しいオブジェクトを作成するが、オブジェクトがすでに存在する場合に重複例外を防ぐ方法はありますか?
言い換えれば、オブジェクトを保存する方法はありますが、オブジェクトがすでに存在する場合は何もしませんか?
回答:
IntegrityError
と現在のトランザクションが中止され、十分ではないと思います。
transaction.atomic
あなたがキャッチします(外atomic
すなわち、ブロックをtry: with acomic: create; except IntegrityError
それはあなたがキャッチしていないことを確認することも難しいです。他のあなたがするつもりのものより整合性エラー
IntegrityError
、私のテストでは、レコードが存在する場合、と比較して実行時間がほぼ半分に短縮されることが示されていget_or_create()
ます。
Djangoの新しいバージョンでは、save()関数がデフォルトでUPDATEまたはINSERTを実行するように見えます。こちらをご覧ください。
それは使用して達成することができます Model.objects.get_or_create()
例
obj, created = Person.objects.get_or_create(
first_name='John',
last_name='Lennon',
defaults={'birthday': date(1940, 10, 9)},
)
任意のキーワード引数(ここではFIRST_NAMEとLAST_NAME get_or_create()に渡された) -と呼ばれるオプションの1を除きますデフォルトは-データベース内(オブジェクトを見つける)、データベースのクエリに使用されます。
タプルを返します。オブジェクトが見つかった場合、get_or_create()はそのオブジェクトのタプルを返し、Falseを返します。
注:try except
ステートメントを使用して同じことを実現することもできます
例:
try:
obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
obj.save()