質問

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分という形式でフィールドにデータを入力するように求められます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top