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 la que se debe completar la tarea:
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 aún se requiere completar una tarea 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 timeDue<now and timeDue>dailyTask.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 en 1.2, pero en 1.4 aparece el error:
can't compare offset-naive and offset-aware datetimes
debido a la linea
if timeDue<now and timeDue>dailyTask.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 argumento, pero esto aún genera el mismo error.
He leído algunos de los documentos sobre zonas horarias, pero estoy confundido sobre si solo necesito hacer que la zona horaria timeDue sea consciente, o si necesito hacer un cambio fundamental en mi base de datos y los datos existentes.
datetime.time
está mal. No tiene sentido almacenar la'Asia/Shanghai'
zona horaria si no conoce la fecha (el desplazamiento de utc puede ser diferente para la misma hora pero en fechas diferentes).make_aware(datetime.now(), get_default_timezone())
falla siget_default_timezone()
difiere de su zona horaria local (debería serlo, pero no es completamente confiable). Simplemente usetimezone.now()
en su lugar (es consciente de la zona horaria si loUSE_TZ
esTrue
).