我正在尝试在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
答案 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()