私は、アプリケーションを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
そして、両方の比較句はこのエラーをスローします。
引数としてpytz.UTCを追加してtimeDueタイムゾーンを認識しようとしましたが、これでも同じエラーが発生します。
タイムゾーンに関するいくつかのドキュメントを読みましたが、timeDueタイムゾーンを認識する必要があるだけなのか、dbと既存のデータに根本的な変更を加える必要があるのかについて混乱しています。
詳細情報については、 完全なドキュメント を確認してください。
通常、_Django.utils.timezone.now
_を使用して、オフセット対応の現在の日時を作成します
_>>> from Django.utils import timezone
>>> timezone.now()
datetime.datetime(2012, 5, 18, 13, 0, 49, 803031, tzinfo=<UTC>)
_
__Django.utils.timezone.make_aware
_は、オフセット対応の日時を作成します
_>>> timezone.make_aware(datetime.datetime.now(), timezone.get_default_timezone())
datetime.datetime(2012, 5, 18, 21, 5, 53, 266396, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
_
次に、両方のオフセット対応の日時をトラブルなしで比較できます。
さらに、タイムゾーン情報を取り除くことにより、オフセットを使用した日時をオフセットを使用しない日時に変換できます。その後、UTCで通常のdatetime.datetime.now()
と比較できます。
_>>> t = timezone.now() # offset-awared datetime
>>> t.astimezone(timezone.utc).replace(tzinfo=None)
datetime.datetime(2012, 5, 18, 13, 11, 30, 705324)
_
_USE_TZ
_はTrue
'default'(実際はデフォルトではFalse
ですが、_settings.py
_によって生成された_Django-admin.py startproject
_ファイルはTrue
に設定します) 、DBがタイムゾーン対応時間をサポートしている場合、時間関連のモデルフィールドの値はタイムゾーン対応になります。設定で_USE_TZ=False
_(または単に_USE_TZ=True
_)を設定することで無効にできます。