2011-12-24 12 views
1

私はフィルタを読んで、Djangoのドキュメントから除外するが、私は、私は次のコードを使用するかどうかということを知りたい:djangoフィルタはパフォーマンスに影響を及ぼしませんか?

Entry.objects.filter(
    ...  headline__startswith='What' 
    ...).exclude(
...  pub_date__gte=datetime.now() 
...).filter(
...  pub_date__gte=datetime(2005, 1, 1) 
...) 

はその後、それが1つのクエリまたは4つのクエリの結果でしょうか?最初にクエリを実行してすべてのオブジェクトを取得し、mysql/dbからすべてのレコードを取得した後でフィルタリングしたり除外したりするか、mysql/dbレベルですべて実行されます。 dbレベルで実行されないと、パフォーマンス上の問題が発生する可能性があるためです。私はそれがフィルタリングされ、アプリケーションレベルまたはdbレベルでの作業を除外することを知りたいのですか?

答えて

1

私は私の質問の答えを得た、それは次のとおりです。 自身Djangoのドキュメントに言ったようにクエリは一度だけ実行されます。

クエリセットは怠け者です - クエリセットを作成する行為は、いずれかを含みませんデータベース活動。 Djangoは、QuerySetが評価されるまで、実際にはクエリを実行しません と これは3つのデータベースヒットのように見えますが、実際には最後の行に1回だけヒットします(q )。一般に、クエリセットの結果は、クエリを実行するまでデータベースからフェッチされません。実行すると、データベースにアクセスしてQuerySetが評価されます。 評価が正確に行われるときの詳細については、"When QuerySets are evaluated"を参照してください。

0

ちょうどハフィズの答えを少し完成させるために、ここで彼の説明のコードを貼り付けました。 (あなたがリンクを提供したにもかかわらず、あなたがprint(q)を参照したときに私は少し失われました!)

>>> q = Entry.objects.filter(headline__startswith="What") 
>>> q = q.filter(pub_date__lte=datetime.date.today()) 
>>> q = q.exclude(body_text__icontains="food") 
>>> print(q) 
関連する問題