Je suis en train de migrer une application de django 1.2 vers 1.4.
J'ai un objet de tâche quotidienne qui contient une heure de la journée à laquelle la tâche doit être terminée:
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']
Afin de vérifier si une tâche doit encore être terminée aujourd'hui, j'ai le code suivant:
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
Cela a bien fonctionné sous 1.2, mais sous 1.4 j'obtiens l'erreur:
can't compare offset-naive and offset-aware datetimes
en raison de la ligne
if timeDue<now and timeDue>dailyTask.last_completed
et les deux clauses de comparaison génèrent cette erreur.
J'ai essayé de rendre le fuseau horaire timeDue conscient en ajoutant pytz.UTC comme argument, mais cela soulève toujours la même erreur.
J'ai lu certains documents sur les fuseaux horaires, mais je ne sais pas si j'ai juste besoin de prendre en compte le fuseau horaire timeDue, ou si je dois apporter une modification fondamentale à ma base de données et aux données existantes.
datetime.time
c'est faux. Il est inutile de stocker le'Asia/Shanghai'
fuseau horaire si vous ne connaissez pas la date (le décalage utc peut être différent pour la même heure mais à des dates différentes).make_aware(datetime.now(), get_default_timezone())
échoue siget_default_timezone()
diffère de votre fuseau horaire local (il devrait l'être mais il n'est pas entièrement fiable). Utilisez simplement à latimezone.now()
place (il est sensible au fuseau horaire siUSE_TZ
c'est le casTrue
).