如何按 Django-filter 包中的日期字段进行过滤?

Posted

技术标签:

【中文标题】如何按 Django-filter 包中的日期字段进行过滤?【英文标题】:How to filter by Date fields in Django-filter package? 【发布时间】: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']

【问题讨论】:

【参考方案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等查询参数。

【讨论】:

感谢它的魅力。你也可以看看这个吗? ***.com/questions/68895105/…【参考方案2】:

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

供您参考:Range

【讨论】:

以上是关于如何按 Django-filter 包中的日期字段进行过滤?的主要内容,如果未能解决你的问题,请参考以下文章

Django-filter:按模型属性过滤

结合 django-filter DateTimeFromToRangeFilter 和 DateTimeInput(datepicker)

你如何使用带有参数列表的 django-filter 包?

SQLAlchemy:如何按两个字段分组并按日期过滤

如何按日期(createdAt)对aws-amplify中列表查询中的字段进行排序?

Django-Filter 包:如何过滤对象以创建统计信息而不是列表