django如何以时间范围进行过滤搜索

  • 102
  • 2022年10月7日01:18:26
  • 阅读模式

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
    ……
本文来自凡蜕博客(https://blog.ysboke.cn), 转载请带上地址.。
匿名

发表评论

匿名网友