2012-03-03 13 views
6

tengo un modelo que describe un evento como este:Django: recuperar correctamente los datos en la fecha y la hora son mayores que ahora

class Event(models.Model): 
    date = models.DateField() 
    time = models.TimeField() 

me gustaría recuperar todos los eventos futuros (es decir, la fecha mayor que now.date()). Sin embargo, si la fecha es hoy, me gustaría recuperar los eventos de hoy con un tiempo mayor que now.time().

Esto es lo que estoy haciendo:

events = Event.objects.filter(date__gte=now.date()).filter(time__gte=now.time()).order_by('-date') 

donde now = datetime.datetime.now()

Pero esto es un error, porque me da un conjunto vacío si el único evento es mañana y su tiempo es menor que el tiempo actual (por ejemplo, si el evento es mañana a las 09:00 y hoy es a las 19:00)

¿esto es posible en django?

PD: Me gustaría evitar iterar a través del conjunto.

+1

¿Por qué utiliza dos campos separados para guardar la fecha y la hora? ¿Por qué no solo un campo de fecha y hora? De esta manera, simplemente puede consultar un solo campo en lugar de dos. –

+3

@pastylegs suponga que usted decide el día de un evento antes de finalizar el tiempo. Puede establecer la hora a medianoche (u otra) para mostrar que no se conoce la hora, pero puede ser más conveniente tener un campo de tiempo separado y almacenar Ninguno. La desventaja es que hace que las consultas como la operación sean más incómodas. – Alasdair

+0

no pensé en eso - buen punto –

Respuesta

9

Utilice Q objetos, que le permiten realizar consultas con instrucciones OR.

from django.db.models import Q 
Events = Event.objects.filter(Q(date=now.date(),time__gte=now.time())|Q(date__gt=now.date())).order_by('-date') 

Tenga en cuenta que es posible que desee ordenar en el campo time así:

order_by('-date', '-time') 
+0

Intenté usar el objeto Q, pero no lo estaba haciendo de la manera correcta. Lo que hiciste es correcto. ¡Gracias! – xpanta

+2

Actualización para Django 1.5.1: ' de django.db.models importar Q' Pero esto no es necesario si sólo se utiliza el DateTimeField: ' eventos = Event.objects.filter (date__gt = datetime.now()) .order_by ('- date') ' –

+1

@RyanAllen No creo que Django 1.5 afecte la pregunta o respuesta original. Había 'DateTimeField's en versiones anteriores de Django también, pero el OP tenía que usar dos campos separados, como se discutió en los comentarios anteriores. – Alasdair

Cuestiones relacionadas