如何将timedelta放入django模型?

时间:2009-04-29 11:26:47

标签: python django model

使用inspectdb,我可以从postgres到django获得一个“间隔”字段。在Django中,它是一个TextField。我检索到的对象确实是一个timedelta对象!

现在我想把这个timedelta对象放在一个新模型中。最好的方法是什么?因为在TextField中放置timedelta会导致对象的str版本...

9 个答案:

答案 0 :(得分:73)

自Django 1.8起,您可以使用DurationField

答案 1 :(得分:29)

您可以在几天或几秒内将timedelta简单地规范化为单个浮点数。

这是“Normalize to Days”版本。

float(timedelta.days) + float(timedelta.seconds) / float(86400)

您可以将浮点数简单地转换为timedelta。

>>> datetime.timedelta(2.5)
datetime.timedelta(2, 43200)

所以,将你的timedelta存储为浮动。

这是“Normalize to Seconds”版本。

timedelta.days*86400+timedelta.seconds

这是相反的(使用秒数)

datetime.timedelta( someSeconds/86400 )

答案 2 :(得分:7)

答案 3 :(得分:7)

首先,定义您的模型:

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。

答案 4 :(得分:3)

此链接可能会有所帮助:{{3p>

答案 5 :(得分:3)

答案 6 :(得分:3)

有一张票可追溯到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 days, 0:00:00

答案 7 :(得分:2)

把它放在那里导致它可能是解决这个问题的另一种方法。 首先安装此库:https://pypi.python.org/pypi/django-timedeltafield

然后:

import timedelta

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

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

答案 8 :(得分:0)

有一个解决方法解释here。如果您使用的是 Postgresql,那么将 F 表达式的结果与 timedelta 相乘可以解决问题。例如,如果您在分钟内有一个 start_time 和一个 duration,您可以像这样计算 end_time

YourModel.objects.annotate(
    end_time=ExpressionWrapper(F('start_time') + timedelta(minutes=1) * F('duration'), output_field=DateTimeField())
)