【问题标题】:How to filter by Date fields in Django-filter package?如何按 Django-filter 包中的日期字段进行过滤?
【发布时间】:2021-10-23 22:22:40
【问题描述】:

我的模型

class Metric(models.Model):

    date = models.DateField()
    channel = models.CharField(max_length=50)
    country = models.CharField(max_length=10)
    os = models.CharField(max_length=10)

我正在使用django-filter 过滤记录。有人可以帮助我如何按时间范围过滤(date_from+date_to 就足够了)。就像在查询参数中用户将提供/metrics?date-gte='2021-08-17'&date-lte='2021-08-19'

我的看法

class MetricViewSet(viewsets.ModelViewSet):
    serializer_class = MetricSerializer
    queryset = Metric.objects.all()
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['country', 'channel','os']

【问题讨论】:

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


    【解决方案1】:

    不要使用filterset_fields 自动生成过滤器集,而是使用filterset_class (Docs) 指定它,并使用DateFromToRangeFilter [django-filter docs] 允许按日期范围过滤:

    from django_filters import rest_framework as filters
    
    
    class MetricFilter(filters.FilterSet):
        date = filters.DateFromToRangeFilter()
    
        class Meta:
            model = Metric
            fields = ['country', 'channel', 'os', 'date']
    
    
    class MetricViewSet(viewsets.ModelViewSet):
        serializer_class = MetricSerializer
        queryset = Metric.objects.all()
        filter_backends = [filters.DjangoFilterBackend]
        filterset_class = MetricFilter
    

    您可以提供/metrics?date_after=2021-08-17&date_before=2021-08-19等查询参数。

    【讨论】:

    【解决方案2】:

    我认为Metric.objects.filter(date__range('2021-08-17', '2021-08-19')) 可以胜任这项工作吗?也许您需要先将日期字符串转换为日期对象。

    供您参考:Range

    【讨论】:

      猜你喜欢
      • 2018-12-30
      • 2015-02-23
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 2020-10-25
      • 2021-11-02
      • 2022-06-11
      相关资源
      最近更新 更多