Выбрать данные за временной интервал в минутах 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