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')

Odpowiedzi:


230

Użyj __rangeoperatora:

...filter(current_issue__isnull=True, created_at__range=(start_date, end_date))

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


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

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))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.