Почему datetime__range работает неправильно? - PullRequest
2 голосов

вид

import datetime
from .models import AccountTransaction


date = datetime.datetime.today()

def account_transactions_week_view(request):
    account_transactions = AccountTransaction.objects.filter(user_id = request.user.id).filter(datetime__range=[date - datetime.timedelta(days=7), date])

модель

class AccountTransaction(models.Model):
    user = models.ForeignKey(User, verbose_name=_('user'))
    datetime = models.DateTimeField(_('created at'), auto_now_add=True)

Я вывожу на страницу список последних записей за прошедшую неделю. Для этого я использую фильтр.

Мне было интересно, почему этот вариант не работает правильно (через некоторое время появляются новые записи):

filter(datetime__range=[date - datetime.timedelta(days=7), date])

Но этот вариант работает правильно:

filter(datetime__gt=date - datetime.timedelta(days=7))

Интересно, а что не так с первым?

Есть промежуточное ПО

class TimezoneMiddleware(object):
    def process_request(self, request):
        tzname = request.session.get('django_timezone')
        if not tzname:
            request.session['django_timezone'] = 'Europe/Kiev'
            tzname = 'Europe/Kiev'
        timezone.activate(pytz.timezone(tzname))

Настройка

TIME_ZONE = 'UTC'

1 Ответ

3 голосов
/ 23 мая 2019

Вы определили date вне метода. Это означает, что определение выполняется, когда модуль впервые импортируется, когда запускается процесс Django. Он будет сохранять одно и то же значение для всех применений этого процесса, пока сервер не решит перезапустить его и создать новый. Таким образом, ваш запрос диапазона будет использовать исходное значение в качестве конечной точки для всех запросов в течение времени жизни процесса.

Решение состоит в том, чтобы просто переместить определение внутрь функции представления.

(Ваш другой запрос работает, потому что он просто выполняет «все, что больше 7 дней с первоначальной даты», что автоматически включает в себя вещи, превышающие исходную дату.)

...