大量のレコードをフィルタリングする必要があるアプリに取り組んでいます。私は 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 時間は返信できません。