如何在Django中过滤日期范围的查询

时间:2019-07-11 16:29:49

标签: python django

在这里,我该如何过滤过去一个月内到此日期添加的所有产品。

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 个答案:

答案 0 :(得分:2)

您可以使用range过滤器指定日期范围(包括日期):

from django.utils import timezone

today = timezone.now().date()

Product.objects.filter(added__range=[today - timezone.timedelta(days=30), today])

答案 1 :(得分:1)

我们首先需要计算上个月。例如,我们可以使用relativedelta [python-doc]中的python-dateutil package [PyPi]。因此,我们可以通过以下方式安装该软件包:

pip install python-dateutil

然后,我们可以过滤Product,这样我们就可以使用Product prev_month对象将所有prev_month添加到一个datetime之后或一个from dateutil.relativedelta import relativedelta from django.utils.timezone import now def all_products(request): all_products = Product.objects.all() prev_month = now() - relativedelta(months=1) recently_added_products = Product.objects.filter(added__gte=prev_month) context = {'all_products':all_products,'recent_products':recent_products} return render(request,'products_list.html',context)就在一个月前:

Product

因此,我们使用__gte lookup过滤所有added日期大于一个月前的added

注意:如果您经常过滤,最好在class Product(models.Model): # ... added = model.DateTimeField(auto_now_add=True, db_index=True)字段上添加db_index=True [Django-doc]
@angular-devkit/build-angular

答案 2 :(得分:1)

您可以使用python datetime并执行类似的操作

import datetime

recently_added_products = Product.objects.filter(date__gte=datetime.date(2019, 7, 1), date__lte=datetime.date(2019, 7, 31))