django如何以时间范围进行过滤搜索?其实用django-filter就可以,不过需要手动转换一下参数。
前端的时间范围,实际上是向后端传送了2个查询参数,分别是开始时间和结束时间,格式都是时间戳。
那么我们首先要对时间戳进行转换,转换成datatime日期时间,对应上数据库表字段类型(如果表字段是时间戳,那么则不必转换)
这里我们使用django-filter
库就行了,代码如下:
1、转换时间戳
def timestamp_to_datetime(value):
value = str(value)
if len(value) == 13:
value = int(int(value) / 1000)
try:
new_value = datetime.datetime.fromtimestamp(int(value)).strftime("%Y-%m-%d %H:%M:%S")
except Exception as e:
raise Exception("时间转换失败!请传时间戳!")
return new_value
2、定义过滤器
class ComponentFilter(django_filters.FilterSet):
create_time__gte = django_filters.CharFilter(method='filter_create_time__gte')
create_time__lte = django_filters.CharFilter(method='filter_create_time__lte')
update_time__gte = django_filters.CharFilter(method='filter_update_time__gte')
update_time__lte = django_filters.CharFilter(method='filter_update_time__lte')
component_name = django_filters.CharFilter(lookup_expr='icontains')
def filter_create_time__gte(self, queryset, name, value):
# 接受前端用于时间查询的 13 位时间戳
new_value = timestamp_to_datetime(value)
return queryset.filter(create_time__gte=new_value)
def filter_create_time__lte(self, queryset, name, value):
new_value = timestamp_to_datetime(value)
return queryset.filter(create_time__lte=new_value)
def filter_update_time__gte(self, queryset, name, value):
# 接受前端用于时间查询的 13 位时间戳
new_value = timestamp_to_datetime(value)
return queryset.filter(update_time__gte=new_value)
def filter_update_time__lte(self, queryset, name, value):
new_value = timestamp_to_datetime(value)
return queryset.filter(update_time__lte=new_value)
class Meta:
model = ComponentManager
# 查询方式 : exact 精确,icontains 模糊
fields = {
"id": ['exact'],
"is_enable": ['exact'],
}
3、在视图里使用过滤器
class xxx(ModelViewSet):
……
filter_class = ComponentFilter
……
80%的人都看过的文章
本文来自凡蜕博客(https://blog.ysboke.cn), 转载请带上地址.。