使用inspectdb,我可以从postgres到django获得一个“间隔”字段。在Django中,它是一个TextField。我检索到的对象确实是一个timedelta对象!
现在我想把这个timedelta对象放在一个新模型中。最好的方法是什么?因为在TextField中放置timedelta会导致对象的str版本...
答案 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())
)