2017-03-02 5 views
1

私はモデルのすべてのオブジェクトのクエリーセットを持っています。オブジェクトを反復すると、列内の値の繰り返しで更新行が削除されます。だからデータベースをもう一度打つことなく、私は大きなクエリセットから更新された行を削除したい。djangoのより大きいクエリーセットからクエリーセットを除外しないでデータベースを打ちます

これを行う最も効率的な方法は何ですか?

+0

SQLに元のリストをフィルタリングする方がよい場合があります。 WHERE句を効率的に実行するように最適化されています。 – duffymo

+0

それは本当ですが、実際に私はSQLで同様のことを試みましたが、それはあまりにも多くの時間とCPU使用量を取っていた。私はSQlでうまくいきません:( – sprksh

+0

あなたのスキーマには索引がないことを示唆しています。SQLでEXPLAIN PLANを実行し、テーブルスキャンを探します。 – duffymo

答えて

0

具体的なユースケースについての詳細情報を提供する必要があるかもしれませんが、実際に必要となるまで、DjangoはQuerySetsの評価を延期します。大規模なQuerySetとは別に除外セットのQuerySetを作成できる場合は、.exclude()メソッドを呼び出し、2つの小さいクエリの代わりに1つの大きなクエリを生成することができます。例:

excluded_set = Model.objects.filter(...) 
large_set = Model.objects.filter().exclude(id__in=excluded_set) 
+0

いいえ、私はデータベース – sprksh

+0

私が間違っている場合は私を修正しますが、フィルターのように除外しても実際にクエリーセットは評価されません - それは '__in'ルックアップで変更されますか?(緑色のボックス参照):https://docs.djangoproject com/ja/1.10/ref/models/querysets /#in – Hybrid

関連する問題