2016-10-06 9 views
0

、それを使用する方が速いだろう。そして、「***。get_or_create()」ではなく「***。filter()。exists():***。create()」を使用する理由はありますか?私は答えを見つけることができません

if not Model.objects.filter(*some_data*).exists(): 
    Model.objects.create(*some_data*) 

Model.objects.get_or_create(*some_data*) 

は誰もが知っていますか?

+0

これはどうでしたか? – e4c5

+0

@ e4c5残念ながら、私は答えがありません – TitanFighter

答えて

1

まあget_or_createは、必要に応じて1 を作成し、与えられたkwargsから (お使いのモデルはすべてのフィールドのデフォルト値を持っている場合、空の場合もある)を持つオブジェクトを調べるのに便利なメソッド

です。

少なくとも、あなたはDRYプリンシパルに違反しています。それを超えて、モデルのすべてのフィールドをプライマリキーまたはユニークフィールドだけでなくチェックしています。すべてのフィールドが一致するオブジェクトを見つけようとしています。あなたが誤った結果を出すチャンスが非常に高く、作成ステートメントは失敗します。だからこそget_or_createはdefaultsのパラメータを持っています

+0

利用可能な場合(例えばpostgresqlを使用している場合)、 'UPSERT' sqlコマンドを呼び出しますか? https://wiki.postgresql.org/wiki/UPSERT –

+0

いいえAFAIKしていません – e4c5

関連する問題