【问题标题】:Add extra field in Django QuerySet as timedelta type在 Django QuerySet 中添加额外字段作为 timedelta 类型
【发布时间】:2011-06-23 12:27:26
【问题描述】:

我有以下型号:

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 查询相比是相当无效的.

【问题讨论】:

    标签: sql django orm django-queryset


    【解决方案1】:

    Add a property 到查看实际字段并将其转换为适当类型的模型。

    【讨论】:

    • 但是我应该在哪里使用属性呢?因为我是 Django 的新手,所以我可以看到它;)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 2018-08-31
      • 2019-12-30
      • 2018-01-19
      • 2019-01-28
      • 2018-11-08
      相关资源
      最近更新 更多