問題は、isinstance 関数が、datetime.datetime インスタンスが datetime.date のインスタンスでもあると言っていることです。
なんで?それは理にかなっている?
Python 2.7.4 (default, Sep 26 2013, 03:20:26)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> d = datetime.datetime(2014, 4, 30, 15, 9, 4, 218466)
>>> isinstance(d, datetime.datetime)
True
>>> isinstance(d, datetime.date)
True
これにより、Django 1.4.10 (私は他のバージョンをチェックしませんでした) が誤って RuntimeWarning を発生させ、日付インスタンスは常に単純であるというルール ( here ) があるため、完全にタイムゾーンを認識した日付時刻はそうではないというメッセージが表示されます。警告は django/db/models/fields/ init .py の 759 行目で発生します。おそらく、これは「日付型のオブジェクトは常にナイーブである」というフレーズの誤解によるものであり、型関数を使用してチェック型を比較する必要があります。 insinstance を使用する代わりに (または、django.utils.timezone.is_aware 関数を使用することをお勧めします)。
これは Django のバグですか、それとも python の isinstance 関数の動作に関するバグですか? または両方?それとも私だけ?
>>> from django.utils.timezone import is_aware, utc
>>> d = datetime.datetime(2014, 4, 30).replace(tzinfo=utc)
>>> is_aware(d)
True
>>> isinstance(d, datetime.date)
True