如何将timedelta放入django模型?

Jac*_* Ha 37 python django model

使用inspectdb,我能够从postgres到django获得一个"间隔"字段.在Django中,它是一个TextField.我检索到的对象确实是一个timedelta对象!

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

Mar*_*urí 84

从Django 1.8开始,您可以使用DurationField.

  • 关于如何使用:/sf/ask/2115586231/ (3认同)

S.L*_*ott 30

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

这是"Normalize to Days"版本.

float(timedelta.days) + float(timedelta.seconds) / float(86400)
Run Code Online (Sandbox Code Playgroud)

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

>>> datetime.timedelta(2.5)
datetime.timedelta(2, 43200)
Run Code Online (Sandbox Code Playgroud)

所以,将你的timedelta存储为浮点数.

这是"Normalize to Seconds"版本.

timedelta.days*86400+timedelta.seconds
Run Code Online (Sandbox Code Playgroud)

这是相反的(使用秒)

datetime.timedelta( someSeconds/86400 )
Run Code Online (Sandbox Code Playgroud)

  • 从python 2.7开始,您可以使用[timedelta.total_seconds](http://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds)方法将其标准化为秒. (3认同)

Gar*_*yde 7

首先,定义您的模型:

class TimeModel(models.Model):
    time = models.FloatField()
Run Code Online (Sandbox Code Playgroud)

要存储timedelta对象:

# td is a timedelta object
TimeModel.objects.create(time=td.total_seconds())
Run Code Online (Sandbox Code Playgroud)

要从数据库中获取timedelta对象:

# Assume the previously created TimeModel object has an id of 1
td = timedelta(seconds=TimeModel.objects.get(id=1).time)
Run Code Online (Sandbox Code Playgroud)

注意:我在这个例子中使用Python 2.7.