Django: Фильтрация данных по дате истечения срока в ближайшие 1 неделю и 2 недели - PullRequest
0 голосов
/ 22 июня 2019

У меня есть класс модели:

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

Но я хочу передать в URLтолько 1 или 2 или 3, которые будут отображать данные за 1 неделю, 2 недели и 3 недели.

Так что, если я передам продукты / 1.он должен фильтровать срок годности на следующую 1 неделю.и если я прохожу продукты / 2.он должен отфильтровать дату окончания следующего 1 месяца.

Я новичок в django .... Поэтому, пожалуйста, дайте мне знать, как лучше всего подойти к этой проблеме.

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Я реализовал это следующим образом:

В папке 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')

Работает нормально ....

в URL:

localhost:8000/products/1

- фильтр всех товаров, срок действия которых истекает через 1 неделю, и / 2 в течение двух недель

0 голосов
/ 23 июня 2019

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

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

...