我有一个名为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
时,第一个查询返回相应的查询集,第二个查询返回空查询集。
答案 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)
尝试使缩进级别匹配,这应该可以解决您的问题。