Как я могу отфильтровать объекты, где сегодняшняя дата попадает в диапазон расчетной даты? - PullRequest
0 голосов
/ 02 октября 2019

Вот код, который у меня есть на данный момент.

    models = Model.objects.annotate(
        start_range=ExpressionWrapper(
            F('a_date_on_the_model') + datetime.timedelta(days=-7),
            output_field=DateField(),
        ),
        end_range=ExpressionWrapper(
            F('a_date_on_the_model') + datetime.timedelta(days=-2),
            output_field=DateField(),
        )
    ).filter(
        F('today')__range=[F('start_range'), F('end_range')]
    )

Очевидно, я не могу сделать диапазон для F('today'), потому что это не столбец / ключевое слово базы данных, но я просто показываю, что у меня есть переменнаяпозвонил сегодня, что я пытаюсь сравнить с. Я чувствую, что я близко, но мог бы использовать некоторую помощь, чтобы закончить это. Примечание: -7 и -2 будут динамическими днями, но жестко закодированы, например. Эти числа и дни могут быть положительными или отрицательными, но первое число всегда будет больше, чем второе число.

Редактировать - это то, как будет выглядеть PSQL:

SELECT
    *
FROM
    my_table
WHERE
    CURRENT_DATE BETWEEN (a_date_on_the_model + INTERVAL '-7 day') AND (a_date_on_the_model + INTERVAL '-1 day');

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Я могу комментировать сегодня.

today=Value(datetime.datetime.now().date(), output_field=DateField())

и тогда я могу сделать:

today__range=[F('start_range'), F('end_range')]
0 голосов
/ 02 октября 2019

Это немного сложно, но я не думаю, что вам нужно использовать аннотирование для этого. Я не уверен, что операторы, которые я использую для даты и времени, точно соответствуют тому, что вы хотите, но если вы настроите это, я думаю, вы получите набор запросов, который вы хотите.

# Get models where the date is less than 7 days old, but more than 2
# days old.
models = Model.objects.exclude(
    a_date_on_the_model__range=(
        today - timedelta(days=7),
        today - timedelta(days=2),
    )
)
...