2012-04-06 57 views
9

tengo un modelo con un campo de fecha y hora:fecha y la fecha y hora en Django

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

quiero conseguir todos los registros creados en la actualidad.

me trataron:

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

y

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

Pero siempre tiene un conjunto vacío. ¿Cuál es la forma correcta en Django para hacer esto?

EDIT:

Parece extraño, pero un registro, creado hoy (06.04.2012 23:09:44) tiene fecha (2012-04-07 04:09:44) en la base de datos. Cuando intento editarlo en el panel de administración parece correcto (06.04.2012 23:09:44). ¿Django lo maneja de alguna manera?

+1

suena como que se está ejecutando en cuestiones de huso horario. De acuerdo con la [documentación] (https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/) fechas de la tienda django con información de zona horaria como UTC en la base de datos. – mklauber

Respuesta

13

Puede haber una solución más adecuada, pero un estudio diagnóstico rápido sugiere que esto funcionaría:

zona horaria
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)) 

Asumo es un objeto de fecha y hora similar.

Lo importante es que está almacenando un tiempo exacto, hasta el milisegundo, y lo está comparando con algo que solo tiene precisión en el día. En lugar de tirar las horas, los minutos y los segundos, django/python los predetermina a 0. Entonces, si su registro se crea en 2011-4-6T06: 34: 14am, entonces compara 2011-4-6T: 06: 34: 14am hasta 2011-4-6T00: 00: 00, no 2011-4-6 (desde la fecha de creación) hasta 2011-4-6 (desde timezone.now(). date()). ¿Servicial?

+0

Tengo que ... parece extraño, pero un registro, creado hoy (06.04.2012 23:09:44) tiene fecha (2012-04-07 04:09:44) en la base de datos. ¿Django lo maneja de alguna manera? –

+0

Ayudó, gracias! –

+0

@Just_Mad, Sí, django almacena todo como UTC en la base de datos. – mklauber

0

probar este

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

No funcionará, igual estará comparando 2011-04-06TXX: XX: XX a 2011-04-06T00: 00: 00. Esto será falso, devolviendo None. – mklauber

+0

No veo cómo no debería funcionar. Es el equivalente exacto de "SELECT * FROM table WHERE date = '2002-04-05'" – luke14free

+0

YourModel.objects.filter (created__published = datetime (now.year, now.month, now.day)), ¿estoy en lo correcto? –