Django:根据下一个1周和2周内的到期日期过滤数据

时间:2019-06-22 19:00:28

标签: django date filter date-range

我有一个模型课:

class Products(models.Model):
   product = models.Charfield(   field specs here .  )
   expiration_date = modelsDateTimeField ( .  field specs here .  )

现在,我希望用户能够看到将在今天起的1周或/和1个月或/和3个月内到期的所有产品。

我已经尝试过:

from django_filters import rest_framework as filters

expiration_date_after = filters.DateFilter(field_name='expiration_date', lookup_expr='gte')
expiration_date_before = filters.DateFilter(field_name='expiration_date', lookup_expr='lte')

为此,我必须在url中传递两个参数:

/products/?expiration_date_after=2019-06-06&expiration_date_before=2019-06-12

但是我只想传递网址1或2或3,它们将显示1周,2周和3周的数据。

所以,如果我通过产品/ 1。它应该过滤下一个星期的到期日期。 如果我通过产品/ 2。它应该过滤下一个月的到期日期。

我是django的新手。...所以,请让我知道解决此问题的最佳方法。

2 个答案:

答案 0 :(得分:0)

您应该这样编写查询:

products = Products.objects.filter(expiration_date__range=[start_date, end_date])

如果您希望以周为单位,则应这样做:

days = 7*n
start_date = today()
end_date = start_date + datetime.timedelta(days=days)

其中n =周数

注意:不要忘记将日期字符串更改为datetime对象

答案 1 :(得分:0)

我是这样实现的:

在custom_filters文件夹中:

from Django_filters import rest_framework as filters
from date time import date time, date, timedelta
import datetime

class DaysFromTodayFilter(filters.Filter):

    def filter(self,qs,value):
        if value not in (None,''):
            days_key = int(value):
            today = datetime.date.today()
            if days_key ==1:
                x_days_from_today = today + date time.timedelta(days=7)
            elif days_key ==2:
                x_days_from_today = today + date time.timedelta(days=14)
            return qs.filter(**{'%s__%s'%(self.field_name, 'range'):(today, x_days_from_today)})
        return qs

在views.py文件中:

from Django_filters import rest_framework as filters
from views import DaysFromTodayFilter
from models import Products
import Django_filters

class ProductsFilter(Django_filters.FilterSet):
    expiration_date_within = DaysFromTodayFilter(field_name='expiration_date')

一切正常。...

网址中的

localhost:8000/products/1

过滤掉所有将在1周内过期且/ 2过期两周的产品