Jestem w trakcie migracji aplikacji z django 1.2 do 1.4.
Mam obiekt zadania dziennego zawierający porę dnia, w którym zadanie powinno zostać ukończone:
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']
Aby sprawdzić, czy zadanie nadal wymaga wykonania dzisiaj, mam następujący kod:
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
To działało dobrze pod 1.2, ale pod 1.4 dostaję błąd:
can't compare offset-naive and offset-aware datetimes
ze względu na linię
if timeDue<now and timeDue>dailyTask.last_completed
i obie klauzule porównania zgłaszają ten błąd.
Próbowałem uświadomić strefę czasową timeDue, dodając pytz.UTC jako argument, ale nadal powoduje to ten sam błąd.
Przeczytałem niektóre dokumenty dotyczące stref czasowych, ale nie wiem, czy muszę po prostu uświadomić strefę czasową timeDue, czy też muszę dokonać fundamentalnej zmiany w mojej bazie danych i istniejących danych.
datetime.time
jest źle. Nie ma sensu zapisywać'Asia/Shanghai'
strefy czasowej, jeśli nie znasz daty (przesunięcie utc może być różne dla tego samego czasu, ale dla różnych dat).make_aware(datetime.now(), get_default_timezone())
kończy się niepowodzeniem, jeśliget_default_timezone()
różni się od lokalnej strefy czasowej (powinno być, ale nie jest w pełni wiarygodna). Po prostu użyjtimezone.now()
zamiast tego (jest świadomy strefy czasowej, jeśliUSE_TZ
jestTrue
).