2016-07-21 8 views
0

間の最速の要求をジャンゴ:は、クエリとサブクエリ

class Record(models.Model): 

    start_time = models.Integerfield() Timestamp 

そして、私は開始日と終了日の間の日数を反復処理するビューインチ

は、それが行うには速いです:

records = Record.objects.filter(
    start_time__gte=dt.datetime.timestamp(start_date), 
    start_time__lt=dt.datetime.timestamp(end_date) 
) 
for start_day, stop_day in days_between_start_and_end_date: 
     records_week = records.filter(
    start_time__gte=dt.datetime.timestamp(start_day), 
    start_time__lt=dt.datetime.timestamp(stop_day) 
) 

または直接実際に

for start_day, stop_day in days_between_start_and_end_date: 
     records_week = Record.objects.filter(
    start_time__gte=dt.datetime.timestamp(start_day), 
    start_time__lt=dt.datetime.timestamp(stop_day) 
) 

私が試したし、任意の違いを見ることができませんでしたが、私は私のために私がやっている理由ので、理解していません第1のケースでは1つの大きな要求があり、第2のケースでは小さいものが多い。どんな考え?

+1

クエリーセットは怠惰であることを覚えておいてください。これらの例のいずれも問合せを実行しません。 – knbk

答えて

1

両方の状況で、クエリセットが評価されることはありません。 filterは、下線の実装でSQL文を作成する以外は何もしないので、どちらの場合でもデータベースにアクセスすることはありません。プログラムにいくつかのSQL文を作成していただけです。変数の使用を開始したときだけ、djangoはクエリーセットの評価を開始します。

Django doc約querysets are lazy。すべてのorm文がdatabsaseに当たっていれば、それは最適ではありません。

関連する問題