-1

Django で生の SQL で記述されたクエリがあります。そのクエリの結果が変数queryResultに割り当てられているとします。

次に、このqueryResultをループし、django ORM を使用してほぼ 3 つのテーブルからデータを取得します。

例えば..

for item in queryResult:
   a=table1.objects.get(id=item[0])
   b=table2.objects.get(id=item[1])
   c=table2.objects.get(id=item[2])
   z=a.result
   x=a.result1
   v=c.result

   ####based on some condition check the data is stored into a list as dictionary.

   recentDocsList.append({'PurchaseType':item[0],
                           'CaseName':z,
                           'DocketNumber':x, 
                           'CourtID':item[2],                             
                           'PacerCmecf':v,                              
                           'DID':item[3]})

ループを完了すると、この recentDocsList が返されます...しかし、全体として、ページへのレンダリングが遅くなります。この問題を解決する方法は誰にでもあります。

PS: 全体が while ループの中にあります。一度に 50 件の結果のみが取得されます。取得した結果が 50 未満であるか、 recentDocsListの長さが 10 に等しい場合、コントロールは while ループから抜け出します。

前もって感謝します。

4

1 に答える 1

0

最適化を早すぎないでください。これにより、難読化や混乱が生じる可能性があります。

SQLite3を使用していても、DBに負担をかけることなく50のチェーンクエリセットをプルできるはずです(PostgreSQLのようなより高性能なDBにアップグレードすると、これがさらに改善されます)。これは、問題が他の場所にあることを示唆しています。これをデバッグするには、モデル/クエリ/ビューを呼び出してみてください。

$ ./manage.py debugshell

これによりSQLクエリが出力されるため、実際に何が呼び出されているかを確認できます。さらに良いのは、 django-debug-toolbarをインストールすることです。これにより、SQL/レンダリングの速度低下がどこにあるかがわかります。

だが!本当に正当な理由がない限り、djangoで実行するカスタムSQLを記述しないでください。ORMがほとんどすべてを処理できます。カスタムSQLの危険性には、恐らく経験しているように、ひどいパフォーマンスが含まれます。

さらにwhile、パフォーマンスに敏感な場所(ページレンダリングなど)でのループは、災害が発生するのを待っているように聞こえますが、これをより安全な方法で書き直すことはできませんか?

より多くのコードを見ずに支援することは困難です-クエリセットの大きさはどれくらいですか?それらは効率的ですか?テーブルへのインデックスはありますか?(許可すればDjangoがこれらを提供しますが、何か別のことをしているように聞こえます)。

于 2013-02-01T10:03:22.793 に答える