Ich bin gerade dabei, eine Anwendung von Django 1.2 auf 1.4 zu migrieren.
Ich habe ein tägliches Aufgabenobjekt, das eine Tageszeit enthält, zu der die Aufgabe ausgeführt werden soll:
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']
Um zu überprüfen, ob eine Aufgabe heute noch erledigt werden muss, habe ich den folgenden Code:
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
Dies funktionierte gut unter 1.2, aber unter 1.4 bekomme ich den Fehler:
can't compare offset-naive and offset-aware datetimes
aufgrund der Linie
if timeDue<now and timeDue>dailyTask.last_completed
und beide Vergleichsklauseln lösen diesen Fehler aus.
Ich habe versucht, timeDue timezone durch Hinzufügen von pytz.UTC als Argument bekannt zu machen, aber dies führt immer noch zu demselben Fehler.
Ich habe einige der Dokumente zu Zeitzonen gelesen, bin jedoch verwirrt darüber, ob ich nur die timeDue-Zeitzone bekannt machen muss oder ob ich meine Datenbank und die vorhandenen Daten grundlegend ändern muss.
datetime.time
ist falsch. Es macht keinen Sinn, die'Asia/Shanghai'
Zeitzone zu speichern, wenn Sie das Datum nicht kennen (der UTC-Offset kann für dieselbe Zeit, aber an unterschiedlichen Daten unterschiedlich sein).make_aware(datetime.now(), get_default_timezone())
schlägt fehl, wenn esget_default_timezone()
von Ihrer lokalen Zeitzone abweicht (es sollte sein, aber es ist nicht vollständig zuverlässig). Verwenden Sietimezone.now()
stattdessen einfach (es ist zeitzonenabhängig, wenn dies der FallUSE_TZ
istTrue
).