3

大量のレコードをフィルタリングする必要があるアプリに取り組んでいます。私は QuerySets のキャッシュと関連するものについて読んでいて、いくつかの良い資料を見つけました。例えば:

django でのクエリ結果のキャッシュ https://docs.djangoproject.com/en/dev/topics/db/queries/#caching-and-querysets

また、QuerySetの動作などについても何か https://docs.djangoproject.com/en/dev/topics/db/optimization/#understand-queryset-evaluation https://docs.djangoproject.com/en/dev/ref/models /querysets/#django.db.models.query.QuerySet.iterator

まだ不明な点もありますが。

私のアプリでは、次のようになっています: [ここには書かれていないバリデーションなどがあります]

qs = MyModel.objects.filter(Q( <initial_filter_to_narrow_down_size>  ))

#I let user to specify other filters and I use qs further

q_object = Q(< [using user_made_filters].pop()> )
for filter in user_made_filters:
    q_object |= Q( <using filter> )

qs = qs.filter(q_object)

n 個の user_made_filters が存在する可能性があります。それらのいくつかについては、|= の代わりに &= を実行する必要があります。

質問:- 1]

qs = MyModel.objects.filter(Q(<initial_filter_to_narrow_down_size>))

この後、後で使用するためにこの qs をキャッシュに入れたいと思います。データベースにアクセスせずに、他のすべてのフィルターを適用したい。何かのようなもの

cache.set('qs', qs)

しかし、 qs = qs.filter(q_object) を実行するとどうなりますか? キャッシュが変更されますか? 私はそれをしたくありません。更新するまでqsを一定のままにしておきたいです。この場合どうすればいいですか?

2] 前に言ったように、OR または AND された Q オブジェクトを生成し、 qs = qs.filter(q_object) を実行し続けます。 これを行うのは、似たようなタイプのフィルターを一度に見つけて適用し、別のタイプのフィルターを取得して続行するためです。また、いくつかのフィルターに優先順位を付ける必要があります。それらが最初に適用され、次に残りが適用されます。私の考えでは、私のqsはタイプ(a)であるため、これを尋ねます。

(a) MyModel.objects.filter( Q(condition1) ).filter( Q(condition2) ) and
(b) MyModel.objects.filter( Q(condition1) & Q(condition2) ) ?

qs が最終的に評価されるとき、django は (a) に従って評価されますか? または、すべてのフィルターを組み合わせて (b) のように評価しますか?

よろしく、

ps- 2 ~ 3 時間は返信できません。

4

1 に答える 1

0

1) いいえ、再度設定しない限り、キャッシュ値は変更されません。
2) はい、2 つのフィルターを適用することは、それらを AND するようなものです。次のように記述して、2 つのクエリセットがまったく同じ sql を生成することを確認できます。

qs1 = MyModel.objects.filter( Q(condition1) ).filter( Q(condition2) )
qs2 = MyModel.objects.filter( Q(condition1) & Q(condition2) )
unicode(qs1.query) == unicode(qs2.query)
于 2012-11-28T17:16:46.723 に答える