Возврат верхней даты в диапазоне DateTimeTZRange
У меня есть модель, в которой есть поле под названием диапазон дат. которое возвращает диапазон дат, оба диапазона дат одинаковы, но время меняется, как я могу получить доступ к одной дате из диапазона в модели, используя ORM.
class My_model(models.Model):
date_range = ranges.DateTimeTZRange()
Похоже, что к нему можно получить доступ с помощью upper
и lower
obj = My_model.objects.all().first()
obj.date_range.upper
obj.date_range.lower
Это поле также присуще RangeField
.
Все это находится в contrib\postgres\fields\ranges.py если это хоть немного поможет
А вот некоторые Query Stuff, которые вам нужны: https://docs.djangoproject.com/en/3.2/ref/contrib/postgres/fields/#querying-range-fields
Редактирование, Агрегация
Источник: Django/Postgres: Aggregate on RangeField
from django.db.models.functions import Upper, Lower
aggrDict = My_model.objects.all().aggregate(
low=Min(Lower('date_range')),
high=Max(Upper('date_range'))
)
print(aggrDict['low'])
print(aggrDict['high'])
Редактирование 2, фильтр
Если вы просто хотите вернуть товар, до которого осталось 20 дней, вы можете сделать следующее:
from datetime import datetime, timedelta
twenty_days_in_the_future = (datetime.now()+timedelta(days=20)).date()
from django.db.models import Case, When, Value, IntegerField
My_model.objects.filter(date_range__lower=twenty_days_in_the_future)
# It might need a __date, idk
My_model.objects.filter(date_range__lower__date=twenty_days_in_the_future)