web-dev-qa-db-ja.com

Djangoモデルにtimedeltaを入れる方法は?

Inspectdbを使用して、postgresからDjangoへの「間隔」フィールドを取得できました。 Djangoでは、それはTextFieldでした。私が取得したオブジェクトは確かにtimedeltaオブジェクトでした!

次に、このtimedeltaオブジェクトを新しいモデルに配置します。これを行う最良の方法は何ですか? TextFieldにtimedeltaを配置すると、オブジェクトのstrバージョンが生成されるため...

39
Jack Ha

時間デルタを日または秒で単一の浮動小数点数に簡単に正規化できます。

こちらが「ノーマライズトゥデイズ」バージョンです。

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 )
31
S.Lott

Django 1.8なので、 DurationField を使用できます。

87
Marc Tudurí
8
Python

まず、モデルを定義します。

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を使用しています。

7
Garrett Hyde

これに関連して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

4
Williams

PostgreSQLの場合、ここでDjango-pgsql-interval-fieldを使用します: http://code.google.com/p/Django-pgsql-interval-field/

3
dotz

これをそこに出すことは、この問題を解決する別の方法かもしれません。最初にこのライブラリをインストールします: https://pypi.python.org/pypi/Django-timedeltafield

次に:

import timedelta

class ModelWithTimeDelta(models.Model):
    timedeltafield = timedelta.fields.TimedeltaField()

管理者内では、次の形式でフィールドにデータを入力するよう求められます:3日、4時間、2分

2
colins44