如何通过一个查询来实现此目的:
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
做。或django.db.expressions
中的When
或Case
可能会有所帮助。
这是一个带有一个查询的解决方案(感谢这篇文章),但我不确定它是否比我的问题中的实现快:
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级别检查了正确的事件。