Mam pole w jednym modelu, takim jak:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
Teraz muszę filtrować obiekty według zakresu dat.
Jak filtrować wszystkie obiekty z datą pomiędzy 1-Jan-2011
i 31-Jan-2011
?
python
django
django-models
django-queryset
użytkownik469652
źródło
źródło
__range
obejmuje granice (jak na SQLBETWEEN
), jeśli nie chcesz granice włączone trzeba by iść z mojego GT / rozwiązanie lt ...order_by
ponad wygenerowaneQuerySet
przez wyżej wymienionefilter
. Nie używałem Django od lat.Możesz używać django
filter
zdatetime.date
obiektami :źródło
Robiąc zakresy django z filtrem upewnij się, że znasz różnicę między użyciem obiektu daty a obiektem daty i godziny. __zakres obejmuje daty, ale jeśli użyjesz obiektu datetime dla daty końcowej, nie będzie zawierał wpisów dla tego dnia, jeśli czas nie zostanie ustawiony.
zwraca wszystkie wpisy od daty początkowej do końcowej, w tym pozycje z tych dat. Zły przykład, ponieważ zwraca on wpisy w tydzień w przyszłości, ale dostajesz dryf.
będą brakować 24-godzinne wpisy, w zależności od ustawionego czasu dla pól daty.
źródło
date
obiekt:>>> from datetime import date
>>> startdate = date.today()
Można obejść problem „niedopasowania impedancji” spowodowanego brakiem precyzji w
DateTimeField/date
porównywaniu obiektów - który może wystąpić w przypadku użycia zakresu - za pomocą datetime.timedelta, aby dodać dzień do ostatniej daty w zakresie. Działa to jak:Jak wspomniano wcześniej, bez robienia czegoś takiego, rekordy są ignorowane ostatniego dnia.
Edytowane, aby uniknąć użycia
datetime.combine
- wydaje się bardziej logiczne, aby trzymać się instancji daty podczas porównywania zDateTimeField
, zamiast bawić się w rzucane (i mylące)datetime
obiekty. Zobacz dalsze wyjaśnienia w komentarzach poniżej.źródło
Example.objects.filter(created__range=[date(2014, 1, 1), date(2014, 2, 1)])
nie będzie to obiekty utworzone nadate(2014, 2, 1)
, jak @cademan wyjaśnił usłużnie. Ale jeśli zwiększysz datę końcową, dodając jeden dzień, otrzymasz zestaw zapytań obejmujący brakujące obiekty (i wygodnie pominiesz obiekty utworzone na podstawiedate(2014, 2, 2)
tego samego dziwactwa). Irytujące jest to, że określony „manualny” zakrescreated__gte ... created__lte=date(2014, 2, 1)
również nie działa, co zdecydowanie jest sprzeczne z intuicją IMHO.Jest proste,
Pracuje dla mnie
źródło
Aby uczynić go bardziej elastycznym, możesz zaprojektować FilterBackend w następujący sposób:
źródło
Nadal aktualne dzisiaj. Możesz także:
źródło