我有以下型号:
class UptimeManager(models.Manager):
def with_length(self):
"""Get querySet of uptimes sorted by length including the current one. """
extra_length = Uptime.objects.extra(select={'length':
"""
SELECT
IF (end is null,
timestampdiff(second,begin,now()),
timestampdiff(second,begin,end))
FROM content_uptime c
WHERE content_uptime.id = c.id
"""
})
return extra_length
class Uptime(models.Model):
begin = models.DateTimeField('beginning')
end = models.DateTimeField('end', null=True) I call
host = models.ForeignKey("Host")
objects = UptimeManager()
...
然后我打电话给Uptime.objects.with_length().order_by('-length')[:10]
以获取最长的正常运行时间列表。
但模板中的length
是整数类型。如何修改我的代码作为管理器返回的对象的长度可以在模板中作为timedelta
对象访问?
我几乎可以通过返回一个列表并将秒数转换为timedelta
个对象来实现它,但是我必须在我的Python代码中进行排序,过滤等,这与完成的一个做得相当无效SQL查询。
答案 0 :(得分:1)
Add a property到查看实际字段并将其转换为适当类型的模型。
答案 1 :(得分:0)
我的解决方案是创建一个过滤器,确定长度var的类型,并在它是某种整数类型的情况下返回timedelta
from django import template
import datetime
register = template.Library()
def timedelta(value):
if isinstance(value, (long,int)):
return datetime.timedelta(seconds=value)
elif isinstance(value, datetime.timedelta):
return value
else: raise UnsupportedOperation
register.filter('timedelta',timedelta)
并在模板中使用它是微不足道的
{{ uptime.length|timedelta }}