問題は、モデルの外部でフィールドインスタンスを使用して値を表現しようとしていることです。
models.DateFieldは、「日付」タイプのデータベースフィールドを表すクラスです。次のいずれかを実行しようとしていると思われます。
- まっすぐな日付の計算をするだけです
- モデルによって返される値を操作する
1の場合、Djangoのモデルはまったく使用しません。必要なのは、Pythonの日付と時刻を処理するクラスだけです。特定の例では、使用する必要があるのは日付オブジェクトのペアだけで、最終的にはtimedeltaオブジェクトになります。
python標準クラスを使用して例で実行しようとしていたことを実行するには、以下の例を参照してください。
from datetime import date
birthday = date(year=2005, month=11, day=1)
today = date.today()
age = today - birthday
print age.days()
ここでは、誕生日の値を使用して日付をインスタンス化し、今日の値を使用して日付を取得し、それらを減算してタイムデルタを取得し、最後に2つの日付の間の日数を出力します。
2の場合、モデルの例を見てみましょう。
class Person(models.Model):
name = models.CharField(max_length=100)
birthday = models.DateField()
ここに、models.CharFieldとmodels.DateFieldを使用して、「varchar」列と「date」列を含むデータベース内のテーブルを記述するモデルがあります。ORMを使用してこのモデルのインスタンスをフェッチすると、Djangoはデータベースが返す値をネイティブデータ型に変換する処理を行います。次に、人のインスタンスの年齢を計算するコードを見てみましょう。
from datetime import date
from myapp.models import Person
person = Person.objects.get(id=1)
age = date.today() - person.birthday
print age.days
ここでは、データベースから人物モデルのインスタンスをフェッチしてから、今日から誕生日を差し引いていることがわかります。ここでこれを行うことができます。これは、「person.birthday」にアクセスすると、Djangoがデータベースから返された値をPythonの日付オブジェクトに変換するためです。これは、「date.today()」によって返される日付オブジェクトと同じタイプであるため、「-」演算子は意味があります。減算演算の結果は、timedeltaオブジェクトです。