【问题标题】:django Rest Framework filter by date rangedjango Rest Framework 按日期范围过滤
【发布时间】:2020-03-09 07:11:42
【问题描述】:

我有给定的视图类

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 的数据

【问题讨论】:

    标签: django django-models django-rest-framework django-views


    【解决方案1】:

    终于得到这个解决方案很久了

    • 双下划线 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']
      }
      

    【讨论】:

    • 还有 ''start_date': ['range']` ,如果 start_datetime 则 ''start_date':['date__range']`
    • 如何执行单场范围过滤?我正在使用 ApiView
    • 我无法在我的 DRF 视图集中使用上述语法:filterset_fields = { 'created_at':['date__range'] }。我得到invalid syntax: 'created_at':['date__range']
    • 我得到了它的工作,我想我需要为每个可过滤字段指定过滤器类型。现在我只是想知道date__range 的查询参数是什么
    【解决方案2】:

    我正在使用过滤器 - 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)
    

    【讨论】:

    • 感谢您的回复。你的答案在 django-filter 上,我在问 django rest framework filter
    • @SohailAhmad 我已经更新了我的答案。我将它与休息框架过滤器一起使用
    • 感谢您的努力,但它不起作用。我想过滤来自两个日期 start_dateend_date 的数据,例如 select * from events where start_date &gt;= '2019-11-01' And end_date &lt;= '2019-11-30'
    【解决方案3】:

    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'})
    

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 2020-03-05
      • 1970-01-01
      • 2016-09-08
      • 2014-09-04
      • 2015-05-12
      • 1970-01-01
      • 2019-08-03
      • 2012-02-07
      相关资源
      最近更新 更多