djangoモデルにtimedeltaを入れる方法は?
質問
inspectdbを使用すると、「間隔」を取得できました。 postgresからdjangoへのフィールド。 Djangoでは、TextFieldでした。取得したオブジェクトは、実際にはタイムデルタオブジェクトです!
ここで、このtimedeltaオブジェクトを新しいモデルに配置します。これを行う最良の方法は何ですか? TimeFieldをTextFieldに入れると、オブジェクトのstrバージョンになります...
解決
timedeltaを日または秒単位の単一の浮動小数点数に簡単に正規化できます。
「日数に正規化」は次のとおりです。バージョン。
float(timedelta.days) + float(timedelta.seconds) / float(86400)
浮動小数点数を簡単にタイムデルタに変換できます。
>>> datetime.timedelta(2.5)
datetime.timedelta(2, 43200)
したがって、タイムデルタをフロートとして保存します。
「秒に正規化」は次のとおりです。バージョン。
timedelta.days*86400+timedelta.seconds
これは逆です(秒を使用)
datetime.timedelta( someSeconds/86400 )
他のヒント
Django 1.8以降では、 DurationFieldを使用できます。 。
最初に、モデルを定義します:
class TimeModel(models.Model):
time = models.FloatField()
timedeltaオブジェクトを保存するには:
# td is a timedelta object
TimeModel.objects.create(time=td.total_seconds())
データベースからtimedeltaオブジェクトを取得するには:
# Assume the previously created TimeModel object has an id of 1
td = timedelta(seconds=TimeModel.objects.get(id=1).time)
注:この例ではPython 2.7を使用しています。
このリンクは役に立つかもしれません:タイムデルタスニペット
これに関連する2006年7月に遡るチケットがあります。 https://code.djangoproject.com/ticket/2443
いくつかのパッチが作成されましたが、プロジェクトに提出されたパッチは次のとおりです。 https://github.com/johnpaulett/django-durationfield
このプロジェクトの他のすべての回答と比較して、このプロジェクトは成熟しており、その包含が現在「肥大化」していると見なされることを除いて、コアにマージされているはずです。
個人的に、私はたくさんの解決策を試しましたが、これは見事に機能します。
from django.db import models
from durationfield.db.models.fields.duration import DurationField
class Event(models.Model):
start = models.DateTimeField()
duration = DurationField()
@property
def finish(self):
return self.start + self.duration
結果:
$ evt = Event.objects.create(start=datetime.datetime.now(), duration='1 week')
$ evt.finish
Out[]: datetime.datetime(2013, 6, 13, 5, 29, 29, 404753)
管理者:
イベントを変更
期間: 7日、0:00:00
これをそこに置くと、この問題を解決する別の方法になるかもしれません。 最初にこのライブラリをインストールします: https://pypi.python.org/pypi/django-timedeltafield
その後:
import timedelta
class ModelWithTimeDelta(models.Model):
timedeltafield = timedelta.fields.TimedeltaField()
管理者内で、3日、4時間、2分という形式でフィールドにデータを入力するように求められます