在django rest framework

时间:2015-10-02 19:45:04

标签: python django django-rest-framework

我有一个名为start_time的字段的模型,其类型为DateTimeField。我想查询与该字段重叠的范围。 Django过滤器包含一个DateFromToRangeFilter过滤器,适用于日期但不适用于 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时,第一个查询返回相应的查询集,第二个查询返回空查询集。

1 个答案:

答案 0 :(得分: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)

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