Я занимаюсь переносом приложения с django 1.2 на 1.4.
У меня есть объект ежедневной задачи, который содержит время дня, когда задача должна быть завершена:
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']
Чтобы проверить, нужно ли выполнить задачу сегодня, у меня есть следующий код:
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
Это нормально работало под 1.2, но под 1.4 я получаю сообщение об ошибке:
can't compare offset-naive and offset-aware datetimes
из-за линии
if timeDue<now and timeDue>dailyTask.last_completed
и оба предложения сравнения вызывают эту ошибку.
Я попытался сделать timeDue осведомленным о часовом поясе, добавив pytz.UTC в качестве аргумента, но это все равно вызывает ту же ошибку.
Я читал некоторые документы о часовых поясах, но не понимаю, нужно ли мне просто указать часовой пояс timeDue или мне нужно внести фундаментальные изменения в мою базу данных и существующие данные.
datetime.time
неверно. Нет смысла сохранять'Asia/Shanghai'
часовой пояс, если вы не знаете дату (смещение utc может отличаться для одного и того же времени, но в разные даты).make_aware(datetime.now(), get_default_timezone())
не работает, еслиget_default_timezone()
отличается от вашего местного часового пояса (так и должно быть, но не полностью). Просто используйтеtimezone.now()
вместо этого (это зависит от часового пояса, еслиUSE_TZ
естьTrue
).