0

私はDjangoを使用してエンジニアリング管理システムを実現しています。私はどこかで本当に間違ったことをしました、そして私のSQLクエリ数はいくつかのページで非常に多いです。

たとえば、1つのページ(単純なListView)で95から98のSQLクエリを取得しました。すべてのクエリは同じです:

SELECT * FROM "syncoor_codification" LIMIT 21

それらは常に同じオブジェクトを返します。モデルのget_queryset()関数によってクエリがトリガーされるのではないかと思います。

Djangoデバッグツールバーを使用すると、次のような行でクエリがテンプレート内でトリガーされていることがわかります。

{% extends 'syncoor/base.html' %}
{% extends 'syncoor/docs/base.html' %}
{% extends 'syncoor/docs/codifications/base.html' %}
{% include 'syncoor/js/jsp.js' %}

この余分なオーバーヘッドをどのように取り除くことができますか?

編集:これがスクリーンショットです:

CSSファイルに対してトリガーされたクエリ

4

2 に答える 2

1

投稿した写真では、スタックトレースに2つの注意点が示されています。

  1. SQL呼び出しは、django-debug-toolbarに関連付けられたシグナルハンドラー、特にTEMPLATEパネル内で実行されています。

  2. SQL呼び出しでは、limit句がREPR_OUTPUT_SIZEに設定されており、テンプレートパネルがクエリセットの表現をレンダリングしようとしていることを示しています。

これにより、ある時点で新しいクエリセットをコンテキストに返す関数またはレイジーオブジェクトが渡され、テンプレートパネルによって評価されているのはこのオブジェクトであると私は信じています。テンプレートパネルのコンテキストで多数のエンティティオブジェクトを見つけることができるかどうかを確認してください。

確認するには、次のように設定してみてください。

DEBUG_TOOLBAR_PANELS = (
    'debug_toolbar.panels.version.VersionDebugPanel',
    'debug_toolbar.panels.timer.TimerDebugPanel',
    'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',
    'debug_toolbar.panels.headers.HeaderDebugPanel',
    'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',
   # 'debug_toolbar.panels.template.TemplateDebugPanel',
    'debug_toolbar.panels.sql.SQLDebugPanel',
    'debug_toolbar.panels.signals.SignalDebugPanel',
    'debug_toolbar.panels.logger.LoggingPanel',
)
于 2013-02-13T05:29:37.820 に答える
-1

データベースにアクセスしているループがbase.htmlテンプレートで実行されているようです。そのため、これらのテンプレートから継承するとクエリが生成されます。テンプレート自体を見ずに正確な問題が何であるかを言うのは難しいですが、それは確かにあなたが答えを見つける場所です。

于 2013-02-04T11:28:58.340 に答える