2012-04-06 16 views
9

Mam modelu z polem datetime:Porównaj data i datetime w Django

class MyModel(models.Model): 
    created = models.DateTimeField(auto_now = True) 

chcę uzyskać wszystkie rekordy utworzone dzisiaj.

Próbowałem:

MyModel.objects.all().filter(created = timezone.now()) 

i

MyModel.objects.all().filter(created = timezone.now().date()) 

Ale zawsze mam zbiór pusty. Jak to działa w Django?

EDIT:

To wygląda dziwnie, ale rekord, stworzony dzisiaj (06.04.2012 23:09:44) ma datę (2012-04-07 04:09:44) w bazie danych. Kiedy próbuję go edytować w panelu administracyjnym, wygląda to poprawnie (06.04.2012 23:09:44). Czy Django jakoś sobie z tym poradzi?

+1

Wygląda na to, że masz problemy z strefami czasowymi. Zgodnie z [dokumentacją] (https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/) django zapisuje daty z informacjami o strefie czasowej jako UTC w bazie danych. – mklauber

Odpowiedz

13

Nie może być bardziej właściwe rozwiązanie, ale szybka obróbka sugeruje, że to będzie działać:

from datetime import timedelta 

start_date = timezone.now().date() 
end_date = start_date + timedelta(days=1) 
Entry.objects.filter(created__range=(start_date, end_date)) 

Jestem zakładając, strefa czasowa jest obiektem datetime-podobne.

Ważne jest, aby przechowywać dokładny czas, do milisekundy, i porównywać go do czegoś, co ma tylko dokładność do dnia. Zamiast przesuwać godziny, minuty i sekundy, django/python ustawia je na 0. Jeśli Twój rekord został utworzony w 2011-4-6T06: 34: 14, to porównuje 2011-4-6T: 06: 34: 14am do 2011-4-6T00: 00: 00, a nie 2011-4-6 (od daty utworzenia) do 2011-4-6 (od timezone.now(). date()). Pomocny?

+0

Mam to ... wygląda to dziwnie, ale zapis, utworzony dzisiaj (06.04.2012 23:09:44) ma datę (2012-04-07 04:09:44) w bazie danych. Czy Django jakoś sobie z tym poradzi? –

+0

To pomogło, dziękuję! –

+0

@Just_Mad, Yep, django przechowuje wszystko jako UTC w bazie danych. – mklauber

0

Spróbuj

from datetime import datetime 
now=datetime.now() 
YourModel.objects.filter(datetime_published=datetime(now.year, now.month, now.day)) 
+2

Nie działa, nadal będziesz porównywać 2011-04-06TXX: XX: XX do 2011-04-06T00: 00: 00. To będzie fałsz, zwracając Brak. – mklauber

+0

Nie widzę, jak to powinno działać. Jest to dokładny odpowiednik "SELECT * FROM table WHERE date = '2002-04-05'" – luke14free

+0

YourModel.objects.filter (created__published = datetime (teraz.rok, teraz.miesiąc, teraz.daj)), czy mam rację? –