Inspectdbを使用して、postgresからDjangoへの「間隔」フィールドを取得できました。 Djangoでは、それはTextFieldでした。私が取得したオブジェクトは確かにtimedeltaオブジェクトでした!
次に、このtimedeltaオブジェクトを新しいモデルに配置します。これを行う最良の方法は何ですか? TextFieldにtimedeltaを配置すると、オブジェクトのstrバージョンが生成されるため...
時間デルタを日または秒で単一の浮動小数点数に簡単に正規化できます。
こちらが「ノーマライズトゥデイズ」バージョンです。
float(timedelta.days) + float(timedelta.seconds) / float(86400)
浮動小数点数を簡単にtimedeltaに変換できます。
>>> datetime.timedelta(2.5)
datetime.timedelta(2, 43200)
したがって、timedeltaを浮動小数点数として格納します。
これが「秒に正規化」バージョンです。
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/244
いくつかのパッチが作成されましたが、プロジェクトに組み込まれたパッチは 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 days, 0:00:00
PostgreSQLの場合、ここでDjango-pgsql-interval-fieldを使用します: http://code.google.com/p/Django-pgsql-interval-field/
これをそこに出すことは、この問題を解決する別の方法かもしれません。最初にこのライブラリをインストールします: https://pypi.python.org/pypi/Django-timedeltafield
次に:
import timedelta
class ModelWithTimeDelta(models.Model):
timedeltafield = timedelta.fields.TimedeltaField()
管理者内では、次の形式でフィールドにデータを入力するよう求められます:3日、4時間、2分