2011-08-15 11 views
3

私はこのラインのメモリ負荷(〜2ギガバイト、オフライン会計と分析ルーチン)を最適化しています:Djangoのオブジェクト...値()を選択のみいくつかのフィールド

l2 = Photograph.objects.filter(**(movie.get_selectors())).values() 

をジャンゴを説得する方法はありますvalues()をフェッチするときに特定の列をスキップするには?

具体的には、ルーチンは特定の条件(dbが最適化され、非常に迅速に実行されます)に一致するテーブルのすべての行を取得しますが、Pythonが処理するには多すぎます - サムネイルのURLを保存します。

私は本当に、各行からの3つのフィールドが必要、しかし、すべてのフィールドが含まれている場合、それが突然、悲しいことに限界までRAMをプッシュ5kBの/行程度消費します。

答えて

16

values(*fields)機能は、あなたがしたいフィールドを指定することができます。

5

チェックアウトクエリセット方法、only。あなたはonlyは、特定のフィールドをすぐにロードしたいことを宣言すると、あなたがそれらにアクセスしようとするまで、QuerySetマネージャは、あなたのオブジェクト内の他のフィールドに引っ張らないであろう。あなたはForeignKeysに対処しなければならない場合

、それもしなければならないプリフェッチ、その後もその使用を明確にすべきであること、良い例を持っているDjangoのドキュメントへの上記select_related

2つのリンクをチェックしてください。


それはあなたがジャンゴ/ Pythonシェル上で、あなたのモデルで遊んとしてあなたは、かかった時間とともに、生成されたSQLクエリを表示することができますdebugsqlshell管理コマンドが付属していますDjango Debug Toolbarを見てみましょう。

関連する問題