过滤最接近给定日期时间的datetime [英] Filter on datetime closest to the given datetime
本文介绍了过滤最接近给定日期时间的datetime的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
谢谢,
解决方案
你可以得到它有两个查询和一些逻辑:
这个想法是找到一个紧跟在目标日期之后的对象,并返回其中一个:
#这个方法是在模型的经理
def get_closest_to(self,target)
nearest_greater_qs = self.filter(dt__gt =目标).order_by('dt')
nearest_less_qs = self.filter(dt__lt = target).order_by(' - dt')
try:
try:
nearest_greater = nearest_greater_qs [0]
除了IndexError:
return nearest_less_qs [0]
try:
nearest_less = nearest_less_qs [0]
除了IndexError:
return nearest_greater_qs [0]
除了IndexError:
raise self.model.DoesNotExist(没有最近的对象
因为没有对象)
如果nearest_greater.dt - target> target - nearest_less.dt:
return nearest_less
else:
return nearest_greater
要获得一个查询,您必须将ORM退出到原始SQL。
I have a model which has a datetime field. Now given a particular datetime - DT, I need to get the object which has the datetime closest to DT. Is this possible?
Thanks,
解决方案
You can get it with two queries and some logic:
The idea is to find one object immediately following and one immediately preceding the target datetime and to return one of them:
# this method is on the model's manager
def get_closest_to(self, target)
closest_greater_qs = self.filter(dt__gt=target).order_by('dt')
closest_less_qs = self.filter(dt__lt=target).order_by('-dt')
try:
try:
closest_greater = closest_greater_qs[0]
except IndexError:
return closest_less_qs[0]
try:
closest_less = closest_less_qs[0]
except IndexError:
return closest_greater_qs[0]
except IndexError:
raise self.model.DoesNotExist("There is no closest object"
" because there are no objects.")
if closest_greater.dt - target > target - closest_less.dt:
return closest_less
else:
return closest_greater
To get it with one query, you have to drop out of ORM to raw SQL.
这篇关于过滤最接近给定日期时间的datetime的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文