Выбрать данные за временной интервал в минутах django orm

Как дела? Мне нужна помощь, пожалуйста. Я работаю в Django и мне нужно сделать запрос всех продаж между 00:00 и 00:30 минутами, то есть каждые 30 минут мне нужно видеть продажи. Я собирал что-то вроде этого, но это не работает.

sales = (
    SalesOrder
    .objects
    .annotate(Sum('subtotal'))
    .filter(created_at__time__range= ('00:00:00:00', ''))
    .filter(created_at__time = hour_now)
)

Это SQL-запрос, который предоставляет правильные данные.

SELECT sum(subtotal) as tot 
  FROM sales_salesorder ss 
 where extract(minute from created_at::time) between 31 and 59 and
       created_at::date = now()::date and 
       extract(hour from created_at) = extract(hour from CURRENT_TIME);

Проблема в том, что я не могу оставить sql запрос, потому что я должен пропустить его через цикл for, чтобы вернуть данные, поэтому наиболее эффективным способом является использование ORM, это и есть причина моего вопроса.

Прямой перевод из вашего sql в django запрос выглядит следующим образом:

from django.utils import timezone

sales = (
    SalesOrder
    .objects
    .filter(created_at__minute__range=(31, 59))
    .filter(created_at__hour=timezone.now().hour)
    .filter(created_at__date=timezone.now().today())
    .count()
)

Но, возможно, более элегантный и дружественный к индексу подход заключается в следующем:

from django.utils import timezone
from datetime import datetime, timedelta

today = datetime.now().today()

date_from = timezone.datetime(
    today.year, today.month, today.day,
    0, 0, 0,
    tzinfo=timezone.get_current_timezone())

date_to = date_from + timedelta(minutes=30)

sales = (
    SalesOrder
    .objects
    .filter(created_at__range=(date_from, date_to))
    .count()
)

Если вы хотите группировать по каждому получасу, вот хороший ответ: https://stackoverflow.com/a/61747028/842935

Вернуться на верх