【问题标题】:Django: Get nearest object in future or pastDjango:获取未来或过去最近的对象
【发布时间】:2017-10-01 10:01:33
【问题描述】:

如何通过一个查询实现这一目标:

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 中的WhenCase 可能会有所帮助。

【问题讨论】:

    标签: python django


    【解决方案1】:

    这是一个查询的解决方案(感谢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 级别的正确事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多