2011-01-13 9 views
1

Ich muss einen Filter für ein Objekt erstellen, die Datumsbereiche überprüft. Im Moment mache ich eine sehr ineffiziente Schleife, die alle Objekte überprüft. Ich möchte dies zu einem Datenbankaufruf vereinfachen.Django komplexen Abfragen

Die Logik ist, Sie haben ein start und ein end Datum Objekte. Ich muss überprüfen, ob der Anfang ODER das Ende innerhalb der Reichweite eines Termins ist.

if (start >= appointment.start && start < appointment.end) || 
    (end > appointment.start && end <= appointment.end) 

Ich könnte dies in SQL, aber ich bin nicht so vertraut mit der Django-Modellstruktur für komplexere Abfragen.

Antwort

4

müssen Sie Q-Objekte für & und OR-Operatoren und die range Feld Lookup-Typ

Q Objekt: http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

Bereich: http://docs.djangoproject.com/en/dev/ref/models/querysets/#range

Entry.objects.filter(Q(start__range=(appointment.start, appointment.end)) | 
    Q(end__range=(appointment.start, appointment.end))) 

Wenn eine SQL-BETWEEN, nicht das, was man ist suchen, können Sie immer bestimmte Kombinationen von Q-Objekten verwenden, um Ihre Bedingungen genau zu reproduzieren:

Entry.objects.filter((Q(start__gte=appointment.start) & Q(start__lt=appointment.end)) | 
    (Q(end__gt=appointment.start) & Q(end__lte=appointment.end))) 
+0

Im ersten Beispiel verwenden Sie 'start_date' und' end_date'? –

+0

Sorry Josh! Das erste Beispiel stammt direkt aus der Dokumentation, und dann habe ich in einem späteren Update Ihre spezifischen Variablen übernommen :) Ich werde diese entfernen –