3

django では、クラスのインスタンスの年齢 (日数) を取得したいと考えています。今日から作成日フィールドを減算してみましたが、正しく機能していないようです。date.today() は正常に動作しますが、DateField が問題を引き起こしています。私のバージョンのソースコードとdjangoドキュメントをオンラインで見ましたが、それを操作して減算を実行する方法がわかりません。

import datetime.date
from django.db import models

class MyItem(models.Model):
    item_name = models.CharField(max_length = 30)
    creation_date = models.DateField()

    def age(self):
        return date.today() - creation_date

my_first_item = MyItem(item_name = 'First', creation_date = '2005-11-01')

print my_first_item.age.days

どんな入力でも大歓迎です!

4

1 に答える 1

2

問題は、モデルの外部でフィールドインスタンスを使用して値を表現しようとしていることです。

models.DateFieldは、「日付」タイプのデータベースフィールドを表すクラスです。次のいずれかを実行しようとしていると思われます。

  1. まっすぐな日付の計算をするだけです
  2. モデルによって返される値を操作する

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オブジェクトです。

于 2011-01-21T02:11:33.530 に答える