1

かなり小さなDjangoアプリからのデータベース呼び出しを最適化しようとしています。現在、私はいくつかのモデルを持っています、InquiryそしてInquiryStatus。MySQLからすべてのレコードを選択するとJOIN、2つのテーブルに適切なステートメントが表示され、その後にInquiryStatusテーブルへの多くのリクエストが続きます。すでに行っているのに、Djangoがまだ個別のリクエストを行っているのはなぜselect_related()ですか?

モデルは次のようになります。

class InquiryStatus(models.Model):
    status = models.CharField(max_length=25) 
    status_short = models.CharField(max_length=5)
    class Meta:
        ordering = ["-default_status", "status", "status_short"]

class Inquiry(models.Model):
    ts = models.DateTimeField(auto_now_add=True)
    type = models.CharField(max_length=50) 
    status = models.ForeignKey(InquiryStatus)
    class Meta:
        ordering = ["-ts"]

デバッグのために一緒に投げたビューは次のようになります。

def inquiries_list(request, template_name="inquiries/list_inquiries.js"):
    ## Notice the "print" on the following line.  Forces evaluation.
    print models.Inquiry.objects.select_related('status').all()
    return HttpResponse("CRAPSTICKS")

を変更せずに使ってみましたselect_related(depth=1)。データベースへの無関係な要求のそれぞれはidWHERE句で特定の1つを選択しています。

アップデート:

したがって、モデルに含める必要のある非常に重要なコードが1つありました。

from fullhistory import register_model
register_model(Inquiry)
register_model(InquiryStatus)

その結果、fullhistory(私が理解できない理由で)個々の結果を取得して解析しました。

4

3 に答える 3

0

あなたが示したコードは実際にはクエリをまったく生成すべきではありません.

qs を実際に評価するテンプレートまたはその他のコード (スライス、反復、印刷など) を提示してください。

于 2009-08-28T06:36:26.277 に答える
0

fullhistoryは最終的にオブジェクトをシリアル化し、インスタンスの各フィールドを評価して比較対象のベースを与えるようです。

get_all_data関数を見てみましょう:

http://code.google.com/p/fullhistory/source/browse/trunk/fullhistory/fullhistory.py

これが発生する詳細な理由を誰かが書きたい場合は、喜んでその答えを正しいとマークします.

于 2009-08-28T14:43:58.343 に答える
0

これは遅延評価に関係していると思います。Django は、models.Inquiry.objects.select_related('status').all() を呼び出すときではなく、必要な場合にのみ DB をヒットします。

http://docs.djangoproject.com/en/dev/topics/db/queries/#id3

于 2009-08-28T00:20:01.437 に答える