使用django-filter按单个日期过滤

时间:2014-12-26 07:08:02

标签: python django django-rest-framework django-filter

我正在尝试仅使用一个参数来过滤时间范围(例如'2014-12-27' < time <= '2014-12-28')。

我目前使用这样的网址来获得一天

http://127.0.0.1:8000/movieapi/movieshowtime/?mixtime=2014-12-27&maxtime=2014-12-28

我希望能够做到这样的事情

http://127.0.0.1:8000/movieapi/movieshowtime/?timerange=2014-12-27 

但它不起作用。我目前使用的过滤器是

class MovieShowtimeFilter(django_filters.FilterSet):
    mixtime = django_filters.DateTimeFilter(name="movietime",lookup_type='gte')
    maxtime = django_filters.DateTimeFilter(name="movietime",lookup_type='lt')
    timerange = django_filters.DateRangeFilter(name='movietime')

    class Meta:
        model = MovieShowtime
        fields = ['mixtime','maxtime','timerange']

1 个答案:

答案 0 :(得分:4)

DateRangeFilter提供的django-filter允许您过滤常见日期范围,例如“今天”,“过去一周”,“上个月”等。它不允许您过滤查询集到特定日期。

您应该可以使用自定义过滤器执行此操作。

from django_filters.filters import DateFilter

class WithinDateFilter(DateFilter):

    def filter(self, qs, value):
        from datetime import timedelta

        if value:
            date_value = value.replace(hour=0, minute=0, second=0)

            filter_lookups = {
                "%s__range" % (self.name, ): (
                    value,
                    value + timedelta(days=1),
                ),
            }

            qs = qs.filter(**filter_lookups)

        return qs

这应该允许您通过网址传递单个日期,并将查询过滤到该特定日期内的次数。

class MovieShowtimeFilter(django_filters.FilterSet):
    timerange = WithinDateFilter(name='movietime')

    class Meta:
        model = MovieShowtime
        fields = ['mixtime','maxtime','timerange']