2017-02-23 6 views
0

Ich versuche, einen Bereich für meine render zu erstellen, aber ich habe nur leere Abfrage, wenn ich now() oder date.today() für Filter Folge für Datum verwenden.Warum Datumsbereich leere Abfrage zurückgeben?

models.py:

class Episode(models.Model): 
    date = models.DateTimeField(null=True, default=now) 

ich importieren Sie die gute Bibliothek für den Prozess:

from django.utils.timezone import now, timedelta 

Ich denke, es ist die gute Art und Weise:

page = 0 
n = now() 
Episode.objects.filter(date__range=[n-timedelta(days=(5*page)), n-timedelta(days=(5*(page+1)))]) 
<QuerySet []> 

Aber es hat nicht funktioniert ... Für Info: Datenbank haben Episoden und Werte, die datetime.datetime typisiert sind:

for e in Episode.objects.filter(): 
    print(e.date) 

2017-02-22 19:12:31.351811+00:00 
2017-02-22 19:12:31.418354+00:00 
2017-02-22 19:12:31.468889+00:00 
2017-02-22 19:12:31.524925+00:00 
2017-02-22 19:12:31.599978+00:00 
2017-02-22 19:12:31.680029+00:00 
2017-02-22 19:12:31.744071+00:00 
2017-02-22 19:12:31.803611+00:00 
2017-02-22 19:12:31.872156+00:00 
2017-02-22 22:24:56.733546+00:00 
2017-02-23 19:16:00.600644+00:00 

Und als i-String direclty im Bereich verwenden, es ist Arbeit ...

Episode.objects.filter(date__range=['2017-02-22 19:12:31.351811+00:00','2017-02-22 19:12:31.744071+00:00']) 
<QuerySet [<Episode: Episode object>, <Episode: Episode object>, <Episode: Episode object>, <Episode: Episode object>, <Episode: Episode object>, <Episode: Episode object>, <Episode: Episode object>]> 

Ich versuche Variablen zu initialisieren, bevor zu ...

n = now() 
page = 0 
startDate = n-timedelta(days=5*page) 
endDate = n-timedelta(days=5*(page+1)) 
Episode.objects.filter(date__range=[startDate, endDate]) 
<QuerySet []> 

Haben Sie eine idear haben Warum kann ich mit now oder datetime filtern und es funktioniert mit einer Zeichenfolge?

EDIT: Die Abfrage

print(Episode.objects.filter(date__range=[startDate, endDate]).query) 
SELECT "table_episode"."id", "table_episode"."card_id", "table_episode"."date", "table_episode"."number", "table_episode"."title", "table_episode"."type_episode", "table_episode"."tag", "table_episode"."url_access" FROM "table_episode" WHERE "table_episode"."date" BETWEEN 2017-02-23 22:46:06.391779 AND 2017-02-18 22:46:06.391779 
<QuerySet []> 
+0

Sie konnten die queryset Abfrage drucken und überprüfen Sie die generierten SQL für Hinweise: 'Druck Episode.objects.filter (date__range = [n-Timedelta (Tage = (5 * Seite)), n-Timedelta (Tage = (5 * (Seite + 1)))]). query " – alfredo138923

+0

Dank Ihrer Antwort, ich denke nicht, dass ich das tun, ich füge es in den Hauptpost. – Buky

+1

'endDate = n-timedelta (Tage = 5 * (Seite + 1))' endDate wird immer kleiner sein als startDate. Überprüfen Sie diese Bedingungen. Hoffe es hilft – alfredo138923

Antwort

1

Danke an @ alfredo138923 für ist h elfenbein.

Ich poste die Lösung mit Erklärung für jeden, der es vielleicht einen Tag braucht.

page = 0 
n = now() 
startDate = n-timedelta(days=5*page)  #more recently date 
endDate = n-timedelta(days=5*(page+1)) #more older date 
Episode.objects.filter(date__range=[endDate, startDate]) #range of 5 days 

ich tatsächlich, wenn Sie Datum, das Sie __range verwenden filtern müssen aber die in jüngster Zeit Datum brauchen in der seconde Position und oldly Datum in der ersten sein.

page = 0 
n = now() 
Episode.objects.filter(date__range=[n-timedelta(days=(5*(page+1))), n-timedelta(days=(5*page))]) 

Gleicher Code aber in einer Zeile/Abfrage.

Citation des Kommentars für alle, die es nicht gelesen:

__range wird SQL ZWISCHEN Aufruf der Funktion, für die erste Argument größer oder gleich und zweite ist kleiner oder gleich. - @iklinac

0

Wenn Ihre Seite = 0

startDate = n (as page = 0) 
endDate = n - 5 days 

die Abfrage übersetzt in die

vor dem Einsteigen 0 Ergebnisse jetzt und Enddatum 5 Tage zwischen Startdatum sucht range documentation