2017-10-01 3 views
0

Wie können Sie dies mit einer Abfrage erreichen:Django: nächstes Objekt in Zukunft erhalten oder in der Vergangenheit

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] 

Meine Idee ist, so etwas zu tun:

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

Aber ich weiß nicht, wie man das maximale Datum implementiert. Vielleicht muss ich es einfach mit Func machen. Oder When oder Case in django.db.expressions könnte hilfreich sein.

Antwort

0

Hier ist eine Lösung mit einer Abfrage (dank this Post), aber ich bin mir nicht sicher, ob es schneller als die Umsetzung in meiner Frage:

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] 

In meinem Fall habe ich schließlich nahm nur die Zeilen in Frage (die beiden neuesten) und auf das richtige Ereignis auf Python-Ebene überprüft.

Verwandte Themen