如果使用 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
当然,
你的请求方法并不需要做其他工作了,
并且建议将捕获的异常细化,
将不同的错误返回不同的状态以及提示信息。
花里胡哨~