2012-03-31 28 views
6

Tengo un modelo Django con Datefield y Timefield separados para un evento. ¿Hay alguna forma de convertirlo en un objeto python datetime para poder consultar los próximos eventos con cierta precisión? Actualmente solo recibo el próximo día siguiente.Django datefield y timefield to python datetime

models.py

event_time = models.TimeField() 
event_date = models.DateField() 

Básicamente, puedo filtrar con un minuto, o incluso fracción de segundo Precition?

Gracias.

+1

No estoy seguro de por qué esto está downvoted:/ –

+0

no tengo ningún problema con ser downvoted, pero sin duda no lo hicieron "no muestran ningún esfuerzo de investigación", no estaría publicando en SO. El problema es que me gustaría evitar cambiar el modelo de la base de datos, al menos por ahora, y no sé cómo consultar con estos dos campos. Puedo definir, dentro de la clase Event, algo así como: def ev_datetime (auto): datetime.datetime.combine retorno (self.event_date, self.start) pero entonces yo no puedo hacer la consulta .Filter (event__ev_datetime__gt = ahora). Ese es mi problema básicamente. – freethrow

Respuesta

9

En su lugar, utilice un DateTimeField (consulte this section en los documentos). La conversión a un datetime.datetime es manejada por Django automáticamente.

A DateField da como resultado un objeto datetime.date y datetime.time. Puede utilizar replace fusionar estos valores en un date actualización:

 
>>> today = datetime.datetime.today() 
>>> today 
datetime.datetime(2012, 3, 31, 11, 6, 5, 182371) 
>>> time = datetime.time(11, 30) 
>>> today.replace(hour=time.hour, minute=time.minute) 
datetime.datetime(2012, 3, 31, 11, 30, 5, 182371) 

Tenga en cuenta que la date resultante tiene como 11.30 hora actual. Tenga en cuenta también que today no se modifica, simplemente calcula una nueva fecha y hora. Como puede ver, ahora tiene que hacer la fusión usted mismo porque ambos valores se almacenan en campos separados. Es por eso que DateTimeField es una opción mucho mejor si tiene la capacidad de modificar los campos del modelo.

4

Debe agregar un nuevo campo como un campo de fecha y hora de fusión. Mejor para el rendimiento.

event_full_datetime = models.DateTimeField() 

reparar la base de datos anterior. para shell como este script.

for obj in YourModel.objects.all(): 
    obj.event_full_datetime = datetime.datetime(obj.event_date.year,obj.event_date.month, obj.event_date.day, obj.event_time.hour, obj.event_time.minut, obj.event_time.second) 
    obj.save()