Django Rest框架按日期范围进行过滤

14

我有一个给定的视图类

class eventList(ListAPIView):

       queryset = Event.objects.all().filter(is_active=1, is_approved=1)
       serializer_class = eventSerialiser
       filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
       search_fields = ['event_name', 'event_address', 'start_date', 'start_time', 'end_time', 
                         'age_max', 'age_min','event_organizer__name', 'event_type__name', 
                         'event_city__name', 'event_tag__name']
       filterset_fields = ['event_name', 'start_date', 'start_time', 'end_date', 'end_time', 
                           'age_max', 'age_min', 'event_organizer', 'event_type', 'event_city', 
                           'event_tag']
       ordering_fields = '__all__'
       ordering = ['-id']

所有过滤器都正常运作,但我怎样才能在日期范围start_dateend_date内获取数据?

3个回答

27

这对我有用。

  • 双下划线gte表示大于等于

  • 双下划线gt表示大于

  • 双下划线lte表示小于等于

  • 双下划线lt表示小于

      filterset_fields = {
          'start_date':['gte', 'lte', 'exact', 'gt', 'lt'],
          'id':['exact'],
          'event_name':['exact'],
          'start_time':['exact'],
          'end_date':['exact'],
          'end_time':['exact'],
          'age_max':['gte', 'lte', 'exact', 'gt', 'lt'],
          'age_min':['gte', 'lte', 'exact', 'gt', 'lt'],
          'event_organizer__name':['exact'],
          'event_type__name':['exact'],
          'event_city__name':['exact'],'event_tag__name':['exact']
      }
    

3
另外,'start_date': ['range'],如果是start_datetime,则为'start_date':['date__range'] - Valery Ramusik
1
我该如何执行单字段范围过滤?我正在使用ApiView。 - jahmed31
我无法在我的DRF视图集中使用上述语法: filterset_fields = { 'created_at':['date__range'] }。 我得到了invalid syntax: 'created_at':['date__range']的错误提示。 - ionescu77
我已经让它工作了,我想我需要为每个可过滤字段指定过滤器类型。现在我只是想知道date__range的查询参数是什么。 - ionescu77

1

https://django-filter.readthedocs.io/en/latest/ref/filters.html#daterangefilter

class Comment(models.Model):
    date = models.DateField()

class F(FilterSet):
    date = DateFromToRangeFilter()

    class Meta:
        model = Comment
        fields = ['date']

# Range: Comments added between 2016-01-01 and 2016-02-01
f = F({'date_after': '2016-01-01', 'date_before': '2016-02-01'})

# Min-Only: Comments added after 2016-01-01
f = F({'date_after': '2016-01-01'})

# Max-Only: Comments added before 2016-02-01
f = F({'date_before': '2016-02-01'})

1
我正在使用过滤器-DateFromToRangeFilter。https://django-filter.readthedocs.io/en/master/ref/filters.html#datefromtorangefilter
class BookFilter(filters.FilterSet):
    min_price = filters.NumberFilter(field_name="price", lookup_expr="gte")
    max_price = filters.NumberFilter(field_name="price", lookup_expr="lte")
    start_date = filters.DateFilter(lookup_expr="gte")
    end_date = filters.DateFilter(lookup_expr="lte")

    class Meta:
        model = Book
        fields = [
            "authors",
            "publishing_house",
            "is_bestseller",
            "category",
            "min_price",
            "max_price",
            "start_date",
            "end_date",
        ]

from django_filters.rest_framework import DjangoFilterBackend

class BookListView(generics.ListAPIView):
    """List of all books"""

    serializer_class = catalog.serializers.BookCatalogSerializer
    pagination_class = ProductsPagination
    queryset = Book.objects.filter(is_active=True)
    filter_backends = [DjangoFilterBackend]
    filterset_class = BookFilter

结果 SQL

WHERE ("catalog_book"."is_active" = true AND "catalog_product"."start_date" >= '2016-01-01T00:00:00+03:00'::timestamptz AND "catalog_product"."end_date" <= '2016-01-01T00:00:00+03:00'::timestamptz)

1
感谢您的回复。您的答案是关于Django-filter的,但我在询问Django Rest Framework的过滤器。 - Sohail Ahmad
@SohailAhmad 我已经更新了我的答案。我将它与rest框架过滤器一起使用。 - V. Chikunov
1
感谢您的努力,但它并没有起作用。我想从两个日期start_dateend_date筛选数据,例如select * from events where start_date >= '2019-11-01' And end_date <= '2019-11-30' - Sohail Ahmad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接