开发者

Add extra field in Django QuerySet as timedelta type

I have the following model:

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
                开发者_StackOverflowIF (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()
    ...

then I call Uptime.objects.with_length().order_by('-length')[:10] to get list of longest uptimes.

But the length in template is of integer type. How to modify my code as the length of object returned by manager would be accessible in template as timedelta object?

I almost could do it by returning a list and converting number of seconds to timedelta objects, but then I have to do sorting, filtering etc. in my Python code which is rather ineffective in comparison to one well done SQL query.


Add a property to the model that looks at the actual field and converts it to the appropriate type.


My solution is to create a filter that determines type of length var and returns timedelta in case it's some integer type

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)

and use in template it's trivial {{ uptime.length|timedelta }}

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜