我有一个模型,其字段名为 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
查询端点时code> 它不过滤查询集。
当我将过滤器更改为 django_filters.DateFromToRangeFilter
时,第一个查询返回适当的查询集,第二个查询返回一个空查询集。
最佳答案
与 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)
尝试使缩进级别匹配,这应该可以解决您的问题。
关于python - 在 django rest 框架中过滤日期时间范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32914722/