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

时间:2011-02-08 15:16:52

标签: sql django orm django-queryset

我有以下型号:

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查询。

2 个答案:

答案 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 }}