Django запрос для фильтрации диапазона дат

У меня есть модель, которая содержит диапазон дат, я хочу отфильтровать данные на основе диапазона дат. то есть я хочу получить данные, диапазон дат которых составляет 90 дней от сегодняшней даты.

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    start_end_date = ranges.DateTimeRangeField(validators= 
                                                       [validate_range_date_time])

Итак, когда мы выбираем начальную дату на странице, конечная дата будет отображаться той же датой, но я не могу объединить фильтр только по сегодняшней дате + timedelta(days=90) это одна единственная дата, а поле является диапазоном дат, поэтому как я могу отфильтровать данные диапазона дат, которые находятся через 90 дней от настоящего времени.

модель хранит дату начала_конца как 'start_end_date': DateTimeTZRange(datetime.datetime(2022, 11, 29, 9, 15), datetime.datetime(2022, 11, 29, 10, 0),

Mymodel.objects.filter(start_end_date__contains=timezone.now() + timezone.timedelta(days=90))

timezone.now() + timezone.timedelta(days=90) = datetime.datetime(2022, 11, 29, 22, 52, 7, 759648)

запрос выдает пустое множество

Я сам не использовал это поле, но на основании того, что я прочитал в документации, оно должно быть таким:

from psycopg2.extras import DateTimeTZRange

Mymodel.objects.filter(
    start_end_date__contained_by=DateTimeTZRange(
        timezone.now(),
        timezone.now() + timezone.timedelta(days=90)
    )
)

чтобы проверить, находится ли какое-либо поле start_end_date через 90 дней, необходимо также передать диапазон времени.

Я думаю, что вы могли бы разработать модель проще.

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

Тогда вы можете найти объекты, подобные следующим.

target_time = timezone.now() + timezone.timedelta(days=90)
MyModel.objects.filter(start_date__lte = target_time).filter(end_date__gte = target_time)
<
max_date = timezone.now() + timezone.timedelta(days=90)
MyModel.objects.filter(start_end_date__startswith__gte=timezone.now(), start_end_date__endswith__lte=max_date)

Надеюсь, это поможет!

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