在Django的QuerySet添加额外的字段作为timedelta类型

我有以下型号:

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查询,而无效的过滤等。

--------------解决方案-------------

添加属性,着眼于实际字段,并将其转换为相应的类型的模型。

我的解决方案是创建一个过滤器,确定长度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 }}

分类:SQL 时间:2012-07-25 人气:5
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.244 (s). 10 q(s)