问题 过滤最接近给定日期时间的日期时间


我有一个具有日期时间字段的模型。现在给定一个特定的日期时间 - DT,我需要得到日期时间最接近DT的对象。这可能吗?

谢谢,


10104
2018-04-06 20:32


起源

就像是 Model.objects.order_by('-datetime').filter(datetime__ge=DT)[0] 假设你有这样的项目。 - Laur Ivan


答案:


您可以通过两个查询和一些逻辑来获取它:

我们的想法是在目标日期时间之后立即找到一个对象,然后返回其中一个:

# 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

要使用一个查询来获取它,您必须将ORM退出到原始SQL。


13
2018-04-06 21:03



什么应该 target 参考 self.filter(dt__gt=target).order_by('dt')? - alias51
这是一个错字,谢谢。 target 是参数 get_closest_to。 - Pavel Anossov


我想完成Pavel的答案,如下:

dt__gte dt__lte

应该用来代替。

提供确切日期时过滤将无法正常工作。


1
2018-04-28 23:51