Django:在将来或过去获取最近的对象

时间:2017-10-01 10:01:34

标签: python django

如何通过一个查询实现此目的:

upcoming_events = Event.objects.order_by('date').filter(date__gte=today)
try:
    return upcoming_events[0]
except IndexError:
    return Event.objects.all().order_by('-date')[0]

我的想法是做这样的事情:

Event.objects.filter(Q(date__gte=today) | Q(date is max date))[0]

但我不知道如何实现最大日期。也许我只是用Func来做。 <{1}}中的WhenCase可能会有所帮助。

1 个答案:

答案 0 :(得分:0)

这是一个包含一个查询的解决方案(感谢this帖子),但我不确定它是否比我的问题中的实施更快:

from django.db.models import Max, Value, Q

latest = (
    Event.objects
         .all()
         .annotate(common=Value(1))
         .values('common')
         .annotate(latest=Max('date'))
         .values('latest')
)
events = Event.objects.order_by('date').filter(
    Q(date__gte=datetime.date.today()) | Q(date=latest)
)
return events[0]

在我的情况下,我最终只是采用了有问题的行(最新的两行),并在Python级别上检查了正确的事件。