Wybierz jedną z dwóch dat z Django

116

Szukam zapytania, które wybiera między datami z Django.

Wiem, jak to zrobić z surowym SQLem dość łatwo, ale jak można to osiągnąć za pomocą Django ORM?

Tutaj chcę dodać 30-dniowe daty w moim zapytaniu:

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
źródło

Odpowiedzi:

230

Użyj __rangeoperatora:

...filter(current_issue__isnull=True, created_at__range=(start_date, end_date))
Daniel Roseman
źródło
Czy „created_at” jest dowolną zmienną w modelu, czy jest to rzeczywisty dziennik bazy danych z czasu utworzenia rekordu?
Bigbob556677
@ Philip556677 To dowolne pole w modelu. Możesz ustawić parametr auto_now_add w DateField na True, aby mieć go łatwo.
Benbb96
21

__range

Ignacio Vazquez-Abrams
źródło
1

dwie metody

.filter(created_at__range=[from_date, to_date])

inna metoda

.filter(Q(created_at__gte=from_date)&Q(created_at__lte=to_date))
  • gte oznacza większe niż równe
  • lte oznacza mniej niż równe
Manjuanth VM
źródło
Q Obiekty są niepotrzebne w drugiej metodzie, możesz napisać:.filter(created_at__gte=from_date, created_at__lte=to_date)
CarMoreno
0

Jeśli używasz DateTimeField, filtrowanie według dat nie obejmie elementów z ostatniego dnia.

Musisz rzutować wartość jako datę:

...filter(created_at__date__range=(start_date, end_date))
suhailvs
źródło