Объект, кэширующий несколько запросов с одинаковым предложением where

#django #django-models

#django #django-модели

Вопрос:

Просто интересно, кэширует ли Django 2.2 ORM возвращенные наборы запросов в этом коде, или запросы выполняются в БД для каждого вызова? Есть ли способ сообщить Django «повторно использовать» наборы запросов, чтобы урок повлиял на БД.

Я создаю это приложение, которое извлекает несколько значений и объектов по разным причинам, но базовый запрос в каждом случае одинаков.

 hrs = Sale.objects.filter(createdate = dte).aggregate(sum=Sum('duration'))['sum'] / 60

stf = Sale.objects.filter(createdate = dte).values_list('idsalestaff', flat=True).distinct().count()

csh = Sale.objects.filter(createdate = dte).aggregate(sum=Sum('cash'))['sum']

crd = Sale.objects.filter(createdate = dte).aggregate(sum=Sum('card'))['sum']
  

Ответ №1:

Все наборы запросов в Django являются ленивыми, поэтому ни один из них фактически не выполняется, пока вы не получите данные из набора запросов в свое приложение (например, с помощью for цикла).

Вы можете создать запрос и применить к нему больше запросов ( hrs.filter(createdate=dte) ), но он все еще ленив, поэтому вы еще не попали в базу данных.

Вы можете принудительно выполнить запрос с помощью одного из этих методов.