Как получить максимальное значение каждого дня в месяце с помощью django queryset

Допустим, у меня есть Model, продукты и у меня есть 100k записей. Теперь я хочу передать месяц 2022-01-01 и получить maximum цену каждого дня прошедшего месяца.

Модель продукта

id     price     date
1.     33.33     2022-01-01
2.     93.33     2022-01-01
3.     64.33     2022-01-02
4.     34.33     2022-01-02
.
.
.
101.   43.33     2022-01-29
102.   74.33     2022-01-30
103.   36.33     2022-01-30

Ожидание результата

93.33
64.33
.
.
.
43.33
74.33

Извините, я не могу объяснить лучше.

Note. Мне нужен только кверисет. Пожалуйста, попробуйте избежать цикла.

Вы можете запросить объекты и аннотировать максимум в день с помощью следующего запроса:

from django.db.models import Max

Product.objects.filter(
    valuta_date__gte="startdate", valuta_date__lt="enddate"
).values("date").order_by("date").annotate(Max("price"))

Вы можете сделать это следующим образом:

from django.db.models import Max

Product.objects.filter(
    my_date__year="2022", my_date__month="01"
).values('my_date').annotate(
  max_price=Max("price")
).order_by()

Но я бы предложил выполнять необработанные запросы при работе с большим набором данных, так как они работают быстрее, например, так:

max_product_query = """
    SELECT id, MAX(price), my_date FROM your_app_product 
    WHERE strftime("%Y-%m", my_date) = '{0}' GROUP BY my_date;
""".format(year_month)

products = Product.objects.raw(max_product_query)
for product in products:
    # do something with the product
 

приведенный выше запрос предназначен для sqlite, для mysql и postgres используйте следующий:

max_product_query = """
    SELECT id, MAX(price), my_date FROM your_app_product 
    WHERE EXTRACT(YEAR_MONTH FROM my_date) = '{0}' GROUP BY my_date';
""".format(year_month)
Вернуться на верх