Кеширование запросов и фильтрация сомнений
Я работаю над приложением, которое требует от меня фильтрации большого количества записей. Я читал о кешировании QuerySets и связанных с ним материалах и нашел хороший материал. Например:
Кэширование результатов запроса в django https://docs.djangoproject.com/en/dev/topics/db/queries/
также кое-что о работе QuerySet и т. д. https://docs.djangoproject.com/en/dev/topics/db/optimization/ https://docs.djangoproject.com/en/dev/ref/models/querysets/
Есть некоторые вещи, все еще неясно, хотя.
В моем приложении это выглядит примерно так: [У меня есть проверки и т.д., здесь не написано]
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)
может быть число 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] Как я уже говорил ранее, я генерирую Q или OR, и продолжаю делать qs = qs.filter (q_object). Я делаю это потому, что сразу нахожу фильтры подобного типа, применяю их, затем получаю фильтры другого типа и продолжаю. Мне также нужно расставить приоритеты для некоторых фильтров. Сначала они будут применены, а затем остальные. есть ли разница между: спрашивать это, потому что в моей идее мой qs имеет тип (а).
(a) MyModel.objects.filter( Q(condition1) ).filter( Q(condition2) ) and
(b) MyModel.objects.filter( Q(condition1) & Q(condition2) ) ?
Я имею в виду, когда, наконец, оценивается qs, будет ли django оцениваться согласно (а)? или он объединит все фильтры и оценит его как (б)?
С Уважением,
PS- не сможет ответить в течение 2-3 часов.
1 ответ
1) Нет, значение кэша не будет изменено, если вы не установите его снова.
2) Да, применение двух фильтров похоже на ANDing их. Вы можете проверить, что два набора запросов производят точно такой же SQL, написав:
qs1 = MyModel.objects.filter( Q(condition1) ).filter( Q(condition2) )
qs2 = MyModel.objects.filter( Q(condition1) & Q(condition2) )
unicode(qs1.query) == unicode(qs2.query)