2014-02-20 3 views
12

Kann mir jemand erklären, warum die folgenden Filter nicht auf der Ebene des Monats und des Tages funktionieren? Filtern nach Jahr scheint zu funktionieren, aber nicht die anderen beiden.Probleme beim Filtern von django datetime Feld nach Monat und Tag

>>> clicks.count() 
36 
>>> date = clicks[0].created 
>>> date.month 
2 
>>> date.year 
2014 
>>> date.day 
1 
>>> clicks.filter(created__month=2) 
[] 
>>> clicks.filter(created__month=02) 
[] 
>>> clicks.filter(created__month='02') 
[] 
>>> clicks.filter(created__month='2') 
[] 
>>> clicks.filter(created__month=date.month) 
[] 
>>> clicks.filter(created__day=date.day) 
[] 

Ein kurzes Update zu zeigen, dass ich das gleiche Verhalten bin immer vor dem Erstellen und den Umgang mit einem queryset:

>>> clicks = PreviewClick.objects.filter(created__month = 2) 
>>> clicks.count() 
0 
>>> clicks = PreviewClick.objects.filter(created__month = 02) 
>>> clicks.count() 
0 
>>> clicks = PreviewClick.objects.filter(created__month = '02') 
>>> clicks.count() 
0 
>>> clicks = PreviewClick.objects.filter(created__month = '2') 
>>> clicks.count() 
0 

Hier ist mehr zu denken:

>>> clicks = PreviewClick.objects.all() 
>>> counter = 0 
>>> for click in clicks: 
...  if click.created.month == 2: 
...   counter += 1 
... 
>>> counter 
35 
+0

Wie haben Sie Klicks erstellt? – Hoopdady

+0

Sind Sie sicher, dass Sie Klicks mit "erstellt" vom Februar haben? Ich habe gerade diesen Filter in einer unserer Datenbanken ausprobiert, und es hat gut für mich funktioniert. – user590028

+1

Es sieht so aus, als ob Sie .objects.all() erstellt und dem Klick zugewiesen haben und dann versuchen, es zu filtern. Wahrscheinlich möchten Sie .Objects.Filter (....) – Hoopdady

Antwort

12

ich genau das gleiche Verhalten wie man sah.

Wenn Sie die documentation für 1,6 und den Monat Abfrage überprüfen. Sie haben folgenden Absatz hinzugefügt:

"Wenn USE_TZ True ist, werden Datetime-Felder vor dem Filtern in die aktuelle Zeitzone konvertiert. Dies erfordert Zeitzonendefinitionen in der Datenbank."

Wenn Sie die folgende Zeile in Ihren Einstellungen auf False ändern, sollten Sie die erwarteten Daten wiederherstellen.

USE_TZ = False 
+0

Hmmm .... interessant. Ich werde das versuchen und sehen, was passiert. Ich denke, ich bin neu im Umgang mit Zeitzonen - ich versuche, richtig nach Zeitzone und so zu filtern, obwohl ich nur UTC für die tatsächlichen Datenbankdatensätze verwende. Ich habe die Zeitzonenberechnungen in den Ansichten gemacht. Brauche ich USE_TZ nicht, wenn ich damit klarkomme? – zorrotmm

+0

Ich habe mich nicht mit Zeitzonen beschäftigt, für die ich Angst habe und die ich für mein aktuelles Projekt nicht benötige, daher reicht mir im Moment meine Lösung. Ich hoffe, dass diese Information Ihnen gegeben hat, was Sie brauchen, damit Ihr Code wieder funktioniert. –

2

Ihre Syntax ist falsch. Es sollte sein:

Clicks.objects.filter(created__month=2) 

(Sie aufgehört haben den Manager ‚Objekte‘)

+0

Ich denke, dass ich nicht angegeben habe, dass Klicks ein Queryset ist, das ich bereits mit .all() oder Filtern bis zum Jahr 2014 bekommen habe, was zu funktionieren scheint. Die Funktion filter() sollte gleich funktionieren. In jedem Fall werde ich die Frage aktualisieren, um zu demonstrieren, dass ich das gleiche Ergebnis erhalte, bevor ich einen Abfrage-Satz erstelle. – zorrotmm

8

@Simon Wilder perfekt beantworten, warum es nicht funktioniert, hier ist, wie Sie es tatsächlich lösen kann TZ Unterstützung in django ohne Deaktivierung

Django Dokument instruction geben Zeitzone-Definition-Datenbank zu installieren:

SQLite: install pytz - Konvertierungen werden tatsächlich in Python durchgeführt.

PostgreSQL: keine Anforderungen (siehe Zeitzonen).

Oracle: keine Anforderungen (siehe Auswählen einer Zeitzonendatei).

MySQL: installieren Sie pytz und laden Sie die Zeitzonentabellen mit mysql_tzinfo_to_sql.

In meinem Fall: mysql und Mac Os, folgenden Befehl das Problem lösen:

sudo mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql 
+0

Dies sollte die richtige Antwort sein – Khonix

0

die Antwort hier zu aktualisieren, da ich in der obigen Ausgabe lief aber keine der Lösungen gearbeitet. Die meisten neuen mysql-Installationen sind mit tz-info vorinstalliert, so dass der mysql_tzinfo_to_sql-Befehl nicht wirklich helfen wird. Und TZ_INFO auf False zu setzen ist nicht wirklich eine Lösung, da viele Zeitzonen bewusste Datetime benötigen.

Also, was für mich funktionierte, war ein TZ aware Datetime-Objekt zu erstellen und zu überprüfen.Sagen wir, dass Sie Datensätze für heute filtern möchten, würden Sie etwas wie tun,

from datetime import datetime 
import pytz 

today = datetime.now().replace(tzinfo=pytz.UTC).date() # tz aware datetime object 
todays_records = myModel.objects.filter(created__year=today.year, created__month=today.month,created__day=today.day) 

Hoffen, dass dies hilft.

Verwandte Themen