django 1.4: no se pueden comparar los tiempos de datos offset-ingenuo y offset-offset

Estoy en el proceso de migrar una aplicación de django 1.2 a 1.4.

Tengo un objeto de tarea diaria que contiene una hora del día en que esa tarea debe completarse:

class DailyTask(models.Model): time = models.TimeField() last_completed = models.DateTimeField() name = models.CharField(max_length=100) description = models.CharField(max_length=1000) weekends = models.BooleanField() def __unicode__(self): return '%s' % (self.name) class Meta: db_table = u'dailytask' ordering = ['name'] 

Para verificar si una tarea aún debe completarse hoy, tengo el siguiente código:

 def getDueDailyTasks(): dueDailyTasks=[] now = datetime.datetime.now() try: dailyTasks = DailyTask.objects.all() except dailyTask.DoesNotExist: return None for dailyTask in dailyTasks: timeDue = datetime.datetime(now.year,now.month,now.day,dailyTask.time.hour,dailyTask.time.minute,dailyTask.time.second) if timeDuedailyTask.last_completed: if dailyTask.weekends==False and now.weekday()>4: pass else: dueDailyTasks.append({'id':dailyTask.id, 'due':timeDue, 'name': dailyTask.name, 'description':dailyTask.description}) return dueDailyTasks 

Esto funcionó bien bajo 1.2, pero debajo de 1.4 me sale el error:

 can't compare offset-naive and offset-aware datetimes 

debido a la linea

 if timeDuedailyTask.last_completed 

y ambas cláusulas de comparación arrojan este error.

He intentado hacer que TimeDue sea consciente de la zona horaria agregando pytz.UTC como un argumento, pero esto todavía genera el mismo error.

He leído algunos de los documentos en las zonas horarias, pero estoy confundido en cuanto a si solo necesito hacer que la Zona horaria sea correcta o si debo hacer un cambio fundamental en mi db y en los datos existentes.

Consulte el documento completo para obtener información detallada.

Normalmente, use django.utils.timezone.now para hacer una fecha y hora actual sensible al desplazamiento

 >>> from django.utils import timezone >>> timezone.now() datetime.datetime(2012, 5, 18, 13, 0, 49, 803031, tzinfo=) 

Y django.utils.timezone.make_aware para hacer una fecha y hora de compensación.

 >>> timezone.make_aware(datetime.datetime.now(), timezone.get_default_timezone()) datetime.datetime(2012, 5, 18, 21, 5, 53, 266396, tzinfo=) 

A continuación, puede comparar ambas fechas de datos con compensación de desplazamiento sin problemas.

Además, puede convertir la fecha y hora de compensación compensada en la fecha y hora de ausencia de compensación eliminando la información de la zona horaria, y luego podría compararse con la datetime.datetime.now() / datetime.datetime.now() , debajo de utc.

 >>> t = timezone.now() # offset-awared datetime >>> t.astimezone(timezone.utc).replace(tzinfo=None) datetime.datetime(2012, 5, 18, 13, 11, 30, 705324) 

USE_TZ es True ‘por defecto’ (en realidad es False por defecto, pero el archivo settings.py generado por django-admin.py startproject establece en True ), entonces si su base de datos admite tiempos de huso horario, los valores del modelo relacionado con el tiempo los campos serían conscientes de la zona horaria. puede deshabilitarlo estableciendo USE_TZ=False (o simplemente elimine USE_TZ=True ) en la configuración.