【问题标题】:Filter on range of datetimes in django rest framework在 django rest 框架中过滤日期时间范围
【发布时间】:2015-10-02 19:45:03
【问题描述】:

我有一个模型,其字段名为start_time,其类型为DateTimeField。我想查询与该字段重叠的范围。 Django 过滤器包含一个DateFromToRangeFilter 过滤器,它非常适用于 dates 但不适用于 datetime 字符串(除非我查询不正确)。到目前为止,这是我尝试过的:

创建了DatetimeFromToRangeFilter:

class DatetimeRangeField(RangeField):
    def __init__(self, *args, **kwargs):
        fields = (
            forms.DateTimeField(),
            forms.DateTimeField())
        super(DatetimeRangeField, self).__init__(fields, *args, **kwargs)

    def compress(self, data_list):
        if data_list:
            start_datetime, stop_datetime = data_list
            if start_datetime:
                start_datetime = datetime.combine(start_datetime, time.min)
                if stop_datetime:
                    stop_datetime = datetime.combine(stop_datetime, time.max)
                    return slice(start_datetime, stop_datetime)
        return None

class DatetimeFromToRangeFilter(RangeFilter):
    field_class = DatetimeRangeField

将此用作过滤器:

class TestRunFilter(filters.FilterSet):
    start_time = filters.DatetimeFromToRangeFilter()

    class Meta:
        model = models.TestRun
        fields = ['start_time',]

当我使用 /test_runs/?start_time_0=2015-09-05 或 /test_runs/?start_time_0=2015-09-05%2000:00:00 查询端点时,它不会过滤查询集。

当我将过滤器更改为django_filters.DateFromToRangeFilter 时,第一个查询返回适当的查询集,第二个查询返回一个空查询集。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    与 django-filter 提供的 DateRangeField 相比,您似乎有一些不正确的缩进。

    在 django_filters/fields.py 中:

            if start_date:
                start_date = datetime.combine(start_date, time.min)
            if stop_date:
                stop_date = datetime.combine(stop_date, time.max)
            return slice(start_date, stop_date)
    

    在您的代码中:

            if start_datetime:
                start_datetime = datetime.combine(start_datetime, time.min)
                if stop_datetime:
                    stop_datetime = datetime.combine(stop_datetime, time.max)
                    return slice(start_datetime, stop_datetime)
    

    尝试使缩进级别匹配,这应该可以解决您的问题。

    【讨论】:

    • 哇,我有时应该检查一下显而易见的事情......谢谢!
    • 作为旁注,我可以简单地删除 combine 语句,因为我有一个完整的时间戳。
    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 2017-10-26
    • 2016-12-09
    • 2015-04-10
    • 2020-03-09
    • 2020-03-05
    • 1970-01-01
    • 2017-09-24
    相关资源
    最近更新 更多