1

フィルタを読み、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レベルで行われない場合、パフォーマンスの問題が発生する可能性があるためです。そのため、アプリレベルまたはデータベースレベルでの作業をフィルタリングして除外することを知りたいのですか?

4

2 に答える 2

2

私は私の質問の答えを得ました、それは:クエリは自分のdjangoドキュメントで述べられているように一度だけ実行されます:

QuerySetは怠惰です-QuerySetを作成する行為には、データベースアクティビティは含まれません。フィルタを1日中積み重ねることができ、DjangoはQuerySetが評価されるまで実際にクエリを実行しません。これは、3つのデータベースヒットのように見えますが、実際には、最後の行(print q)でデータベースに1回だけヒットします。一般に、QuerySetの結果は、ユーザーが「要求」するまでデータベースからフェッチされません。その場合、QuerySetはデータベースにアクセスして評価されます。評価が行われる正確なタイミングの詳細については、「QuerySetsが評価されるタイミング」を参照してください。

于 2011-12-24T22:14:30.703 に答える
1

ハフィズの答えを少し完成させるために、ここに彼の説明のコードを貼り付けました。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)
于 2013-05-17T09:55:02.200 に答える