如何在django模型中使用timedelta?

如何在django模型中使用timedelta?,django,Django,使用inspectdb,我能够从postgres到django获得一个“interval”字段。在Django,它是一个文本字段。我检索到的对象确实是一个timedelta对象 现在我想把这个timedelta对象放到一个新模型中。最好的方法是什么?因为将timedelta放入文本字段会导致对象的str版本…您可以在几天或几秒钟内将timedelta标准化为单个浮点数 这是“正常化为天”的版本 您可以简单地将浮点数转换为时间增量 >>> datetime.timedelta(2

使用inspectdb,我能够从postgres到django获得一个“interval”字段。在Django,它是一个文本字段。我检索到的对象确实是一个timedelta对象


现在我想把这个timedelta对象放到一个新模型中。最好的方法是什么?因为将timedelta放入文本字段会导致对象的str版本…

您可以在几天或几秒钟内将timedelta标准化为单个浮点数

这是“正常化为天”的版本

您可以简单地将浮点数转换为时间增量

>>> datetime.timedelta(2.5)
datetime.timedelta(2, 43200)
因此,将时间增量存储为浮点

这是“标准化为秒”的版本

这是相反的(用秒)


对于PostgreSQL,请在此处使用django pgsql interval字段:

首先,定义您的模型:

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月的罚单与此相关:

编写了几个修补程序,但其中一个已提交给项目:

与这里的所有其他答案相比,该项目是成熟的,本应合并到core中,但其包含内容目前被认为是“膨胀的”

就我个人而言,我刚刚尝试了一系列解决方案,这是一个非常有效的解决方案

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

因为这可能是解决此问题的另一种方法。 首先安装此库:

然后:


在管理员中,您将被要求以以下格式在字段中输入数据:3天4小时2分钟,因为您可以使用Django 1.8。

这里介绍了一种解决方法。如果您使用的是Postgresql,那么将
F
表达式的结果乘以
timedelta
就可以解决问题。例如,如果您有
开始时间
持续时间
(以分钟为单位),您可以这样计算
结束时间

YourModel.objects.annotate(
结束时间=ExpressionWrapper(F(“开始时间”)+timedelta(分钟=1)*F(“持续时间”),输出字段=DateTimeField()
)

你指的是浮动(timedelta.days)+浮动(timedelta.seconds)/float(86400)。。。但它是有效的@Jack Ha:感谢您发现了这个问题。timedelta.days+timedelta.seconds/86400.0自从python 2.7以来,您可以使用该方法将其规范化为秒。在存储库中:检查。工作:检查。感谢分享。在低于2.7版本的python上可以使用公式:
total_seconds=(td.microsonds+(td.seconds+td.days*24*3600)*10**6)/10**6
这太棒了。感谢您的简洁和透彻。在Django 1.8中,该票据最终将被关闭,Django将有一个
DurationField
:我更喜欢使用Django 1.7的此解决方案,因为它在pip回购中,而不是外部源。由于Django 1.8您可以使用DurationField。因此,如何使用:
# Assume the previously created TimeModel object has an id of 1
td = timedelta(seconds=TimeModel.objects.get(id=1).time)
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)
import timedelta

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