Django - кеш запросов для object_list - PullRequest
0 голосов
/ 12 июля 2011

Я использую метод object_list () вручную в одном из моих представлений для разбивки на страницы и некоторых других интересных средств автоматизации.Я пытаюсь кэшировать огромный набор запросов и позаботиться обо всем, что может повлиять на object_list (например, request.GET ['page']), но упрощенная идея выглядит следующим образом:

def some_view(request):
qs = cache.get('key')
if qs == None:
    qs = QS.objects.filter(some_huge_query)
    cache.set('key', qs)
return object_list(queryset = qs,...)

На самом деле набор запросов выполняется еще раз во время шаблонарендеринг.Есть ли способ предотвратить выполнение набора запросов?

Ответы [ 4 ]

2 голосов
/ 12 июля 2011

Линия:

if qs = None:

это проблема. Вы сохраняете None в qs вместо проверки равенства (==). В результате, qs равен всегда None и получает r-оценку каждый раз через.

Вам необходимо изменить его на:

if qs == None:

Или просто:

if not qs:
0 голосов
/ 12 июля 2011

Насколько я знаю:

if qs == None:

может оценить ваш набор запросов. По крайней мере, я уверен, что if qs или if not qs оценивает набор запросов.

Попробуйте:

if qs is not None:

Также было бы полезно увидеть ваш метод и шаблон object_list.

0 голосов
/ 12 июля 2011

Вам необходимо сохранить оцененный набор запросов в вашем кеше, поэтому вы должны вызвать:

cache.set('key', list(qs))

, чтобы принудительно оценить набор запросов в списке;в противном случае это будет просто запрос, хранящийся в кеше!

0 голосов
/ 12 июля 2011

Вы можете использовать values_list , чтобы превратить этот огромный QuerySet в список, а затем передать этот список шаблону, что должно привести к повторной оценке QuerySet.

...