Как отфильтровать запросы с диапазоном дат в Django - PullRequest
2 голосов
/ 11 июля 2019

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

models.py

class Product(models.Model):
    name = models.CharField(max_length=250)
    description = models.TextField(blank=True)
    featured = models.BooleanField(default=False)
    added = model.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

views.py

def all_products(request):
    all_products = Product.objects.all()
    recently_added_products = Product.objects.filter(...)
    context = {'all_products':all_products,'recent_products':recent_products}
    return render(request,'products_list.html',context)

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Вы можете использовать фильтр range, чтобы указать диапазон дат (включительно):

from django.utils import timezone

today = timezone.now().date()

Product.objects.filter(added__range=[today - timezone.timedelta(days=30), today])
1 голос
/ 11 июля 2019

Вы можете использовать python datetime и сделать что-то вроде этого

import datetime

recently_added_products = Product.objects.filter(date__gte=datetime.date(2019, 7, 1), date__lte=datetime.date(2019, 7, 31))
1 голос
/ 11 июля 2019

Сначала нам нужно рассчитать предыдущий месяц. Например, мы можем использовать relativedelta [python-doc] из пакета python-dateutil [PyPi] . Таким образом, мы можем установить этот пакет с:

pip install <b>python-dateutil</b>

Затем мы можем отфильтровать Product s так, чтобы мы получили все Product s, которые были добавлены после или один prev_month с prev_month объектом datetime, который ровно месяц назад:

from dateutil.relativedelta import <b>relativedelta</b>
from django.utils.timezone import <b>now</b>

def all_products(request):
    all_products = Product.objects.all()
    <b>prev_month = now() - relativedelta(months=1)</b>
    recently_added_products = Product.objects.filter(<b>added__gte=prev_month</b>)
    context = {'all_products':all_products,'recent_products':recent_products}
    return render(request,'products_list.html',context)

Таким образом, мы используем __gte lookup для фильтрации всех Product с датой added больше, чем месяц назад.

Примечание : если вы часто фильтруете, может быть лучше добавить db_index=True</b> [Django-doc] в поле added:
class Product(models.Model):
    # ...
    added = model.DateTimeField(auto_now_add=True<b>, db_index=True</b>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...