Django-RESTFramework 时间区间查询问题

2,614 阅读1分钟

MedusaSorcerer的博客

如果使用 Django-RESTFramework 框架可以实现多种查询以及排序的方式, 唯独时间区间查询的问题没有得到解决。
依照这样的问题, 参考了 ordering 参数的传参方式, 有了以下时间过滤查询的传参方式:

http://127.0.0.1:8000/index?time=2020-01-01 12:00:00,2020-10-01 12:00:00
当然, 你的时间字符串需要符合 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 的格式条件才可以, 那对于框架而言, 怎么构造接口的逻辑呢?
你可能会想到在 list(self, request, *args, **kwargs) 中做类似于以下方式的逻辑判断: 然而事实上这样的追加过滤条件毫无意义, 在你查阅过 list 的源码时会发现, 它本身获取到的数据是来源于 self.get_queryset(), 所以就有了以下代码块:
def get_queryset(self):
    queryset = self.queryset
    try:
        tfs = self.request.query_params.get('time')
        if tfs:
            start, stop = str(tfs).split(',')
            if start and stop:
                queryset = queryset.filter(Q(time__gte=start) & Q(time__lte=stop))
            elif start:
                queryset = queryset.filter(time__gte=start)
            elif stop:
                queryset = queryset.filter(time__lte=stop)
    except (Exception,):
        raise exceptions.ParseError('time value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format.')
    return queryset
当然, 你的请求方法并不需要做其他工作了, 并且建议将捕获的异常细化, 将不同的错误返回不同的状态以及提示信息。


花里胡哨~