下一个即将到来的日期模型对象忽略过去的日

时间:2015-04-21 16:02:04

标签: python django

我正在尝试在django模型查询集上使用latest()来返回模型中的下一个即将到来的日期。

我尝试了一些不同的东西,在过滤器上使用__lte__gte查找但无济于事。

如果有一种方法可以有效地利用exclude()中的模型方法但是没有编写一个不会成为选项的自定义管理器,那么过滤器选项对我有用。

必须有一种更简单的方法吗?

class RaidSession(models.Model):
    scheduled = models.DateTimeField()
    duration = models.DurationField()

    def is_expired(self):
        duration_to_date = self.scheduled + self.duration
        return True if duration_to_date < timezone.now() else False

1 个答案:

答案 0 :(得分:1)

由于我是一所古老的学校,通常可以帮助我将这些问题视为SQL查询。在你的情况下,这将是

SELECT * FROM app_raidsession rs
    WHERE rs.scheduled >= now()
    ORDER BY rs.scheduled
    LIMIT 1

这会为您提供下一次预定的raid。

在django ORM中,您应该能够或多或少直接将其翻译为:

from django.utils.timezone import now

# first() returns None if the result is empty
next_raid = models.RaidSession.objects \
    .filter(scheduled__gte=now()) \
    .order_by('scheduled') \
    .first()

如果持续时间相关,则需要F-expression

from django.db.models import F

next_raid = models.RaidSession.objects \
    .filter(scheduled__gte=now() - F('duration')) \
    .order_by('scheduled') \
    .first()