Фильтрация сообщений за вчерашний день, последнюю неделю и последний месяц не работает - PullRequest
0 голосов
/ 27 мая 2020

Я использую простую форму для фильтрации сообщений на основе вчерашнего дня, прошлой недели, прошлого месяца и прошлого года.

enter image description here

И это посмотреть, как я хотел, чтобы это было обработано:

def search(request):
    queryset = Listing.objects.all().order_by('listing_date')

    # filter by date added
    list_date = request.GET.get('list_date')
    today = timezone.now()
    if list_date:
        if list_date == 'yesterday':
            yesterday = today - timedelta(days=1)
            print(yesterday, 'yesterday')
            queryset = queryset.filter(listing_date__lt=yesterday)
            print(queryset) 
        elif list_date == 'lastweek':
            lastweek = today - timedelta(weeks=1)
            queryset = queryset.filter(listing_date__lt=lastweek)
        elif list_date == 'lastmonth':
            lastmonth = today - timedelta(days=30)
            queryset = queryset.filter(listing_date__lt=lastmonth)
        elif list_date == 'lastyear':
            lastyear = today - timedelta(days=365)
            queryset = queryset.filter(listing_date__lt=lastyear)

    context = {
        'listings': queryset,
    }

    return render(request, 'listing/listings.html', context)

и в модели: listing_date = models.DateTimeField(auto_now_add=True). Я напечатал вчера и набор запросов выше, и он возвращает это в консоли:

2020-05-26 03:54:45.107533+00:00 yesterday 
<QuerySet []>

Я отфильтровал сообщения за вчерашний день, но почему набор запросов пуст, хотя я уверен, что сообщения были созданы вчера?

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Вам необходимо использовать следующие фильтры

Использование

  1. вчера
yesterday = today - timedelta(days=1)
queryset = queryset.filter(listing_date<b>__date</b>=yesterday)
на прошлой неделе
lastweek = today - timedelta(weeks=1)
queryset = queryset.filter(listing_date<b>__week=lastweek.isocalendar()[1]</b>)
последний месяц
lastmonth = today - timedelta(days=30)
queryset = queryset.filter(listing_date<b>__month=lastmonth.month</b>)
в прошлом году
lastyear = today - timedelta(days=365)
queryset = queryset.filter(listing_date<b>__year=lastyear.year</b>)

Примечание

python timedelta(...) это немного точный , поэтому я предлагаю использовать relativedelta(...).

0 голосов
/ 27 мая 2020

Вы используете фильтр «меньше», вместо этого следует использовать фильтр «меньше или равно»

    if list_date == 'yesterday':
            yesterday = today - timedelta(days=1)
            print(yesterday, 'yesterday')
            queryset = queryset.filter(listing_date__lte=yesterday)
            print(queryset)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...