Wählen Sie mit Django zwischen zwei Daten

116

Ich möchte eine Abfrage machen, die zwischen Daten mit Django auswählt.

Ich weiß, wie man das mit Raw SQL ziemlich einfach macht, aber wie kann dies mit dem Django ORM erreicht werden?

Hier möchte ich die Daten zwischen 30 Tagen in meine Abfrage einfügen:

start_date = datetime.datetime.now() + datetime.timedelta(-30)
context[self.varname] = self.model._default_manager.filter(
    current_issue__isnull=True
    ).live().order_by('-created_at')
Jeff Taggarty
quelle

Antworten:

230

Verwenden Sie den __rangeOperator:

...filter(current_issue__isnull=True, created_at__range=(start_date, end_date))
Daniel Roseman
quelle
Ist das "created_at" ein beliebiges Feld in einem Modell oder ist dies das tatsächliche Protokoll der Datenbank, als der Datensatz erstellt wurde?
Bigbob556677
@ Philip556677 Es ist ein beliebiges Feld in einem Modell. Sie können den Parameter auto_now_add von DateField auf True setzen, um ihn einfach zu haben.
Benbb96
21

__range

Ignacio Vazquez-Abrams
quelle
1

zwei Methoden

.filter(created_at__range=[from_date, to_date])

eine andere Methode

.filter(Q(created_at__gte=from_date)&Q(created_at__lte=to_date))
  • gte bedeutet größer als gleich
  • lte bedeutet weniger als gleich
Manjuanth VM
quelle
Q Objekte sind in der zweiten Methode nicht .filter(created_at__gte=from_date, created_at__lte=to_date)
erforderlich.
0

Wenn Sie a verwenden DateTimeField, werden beim Filtern mit Datumsangaben keine Elemente am letzten Tag berücksichtigt.

Sie müssen den Wert als Datum umwandeln:

...filter(created_at__date__range=(start_date, end_date))
suhailvs
quelle