2011-01-21 10 views
2

djangoでは、クラスのインスタンスの経過日数(日数)を取得します。私は、今日から作成日付フィールドを減算することでそれを試みましたが、正しく動作していないようです。 date.today()は正常に動作しますが、DateFieldは問題を起こしています。私はそのソースコードとdjango docs online for my versionを見ましたが、私は減算を実行するためにそれを操作する方法がわかりません。Pythonのdatetime.dateからdjango.db.models.DateFieldを差し引いて年齢を取得します。

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 

すべての入力をいただければ幸いです!

答えて

1

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

models.DateFieldは、「日付」タイプのデータベースフィールドを表すクラスです。

  1. ちょうど「あなたがドン、ストレート日付数学1の場合はモデル

によって返された値を持つ

  • 作業を行います。私は、あなたが以下のいずれかを実行しようとしていると思われますDjangoのモデルをまったく使用したくありません。あなたが必要としたいのは、Pythonの日時処理クラスだけです。特定の例では、使用する必要があるのはdateオブジェクトのペアであり、最終的に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() 
    

    我々は我々が含まれているデータベース内のテーブルをdescriveする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オブジェクトに戻った値を変換しているので、ここでこれを行うことができます。これは "date.today()"によって返される日付オブジェクトと同じ型であるため、 " - "演算子が意味を持ちます。減算演算の結果はtimedeltaオブジェクトです。

  • +0

    ありがとうございます!これは最初から明確ではありませんでしたが、ケース2でした。状況を反映するようにコードを編集しました。 9行目でわかるように、私は「自己」を見逃したばかげたミスでした。接頭辞。あなたの説明はそれを発見するのに役立ちました。 – arturomp

    0

    時間デルタをご覧ください。

    関連する問題