2

ほとんどのプロジェクトで、メモリに最も負荷がかかるのは、次のようなビッグ データ クエリが Python メモリに読み込まれるときです。

Model.objects.filter(...).order_by(...)[:50] 
# The second [:50] is evaluated, the entire dataset is shoved into memory.

django docs: .defer()および.only() queryset メソッドは、メモリ使用量を削減するためのヒントとして言及されていますが、それらについてはあまり言及されていません。

私の主な質問は、モデルインスタンスを .save() または .delete() しようとするとき、pk 以外のすべてが延期されたモデルでそれを呼び出すだけでよいのでしょうか? 元:

model = Model.objects.only("pk").get(pk=12)
# is model.save() or model.delete() okay here?

おそらく他にも .only() と .defer() に注意が必要な風変わりなケースがありますが、今のところ思いつきません。しかし、それらは非常に便利な方法のように思えます..誰かが思いついたら、投稿してください、ありがとう.

4

2 に答える 2

2

フィールドsave()のみでモデルを呼び出すことがなぜ役立つのか、私にはわかりません。pkただし、オブジェクトをインスタンス化するオーバーヘッドを発生させずにオブジェクトを削除したい場合は、queryset メソッドを使用できます。

MyModel.objects.filter(pk=12).delete()

これはモデルにあるカスタム メソッドを呼び出さないことに注意してください。ただしdelete()、それ以外の場合は、インスタンスを取得して削除を呼び出すよりもはるかに効率的です。

于 2013-01-08T09:57:48.280 に答える
0

onlyモデルのIDをdefer常に取得して、通常どおりに使用できるようにします。

ただし、Djangoのormには、クエリごとにメモリオーバーヘッドがありますDEBUG=Trueドキュメントを参照)。

于 2013-01-08T07:41:18.330 に答える