使用django 1.8 duration字段来注释一组django对象

时间:2015-08-04 16:20:39

标签: python django django-models django-admin

我正在阅读django duration字段的文档,我无法弄清楚如何用它来注释一组具有持续时间的django对象。文档说db会将持续时间存储为整数并聚合它需要转换为timedelta,如下所示:

timedelta(microseconds=list.aggregate(sum=Sum('duration'))['sum'])

我的问题是我不知道如何将此表达式用作一组django对象的注释。 documentation can be found here

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

我不确定如何将此表达式用作一组django对象的注释

简短的回答是:你做不到。

如果您正在讨论使用sums注释查询集,那么我假设duration字段位于相关模型上(通过多对多或反向外键关系)并且您希望得到总和父模型的每一行的持续时间。

您可以使用int duration持久值以微秒为单位注释查询集,如下所示:

qs = MyModel.objects.annotate(sum=Sum('related_model__duration'))

或者,您可能直接在duration上有MyModel字段但正在聚合(即SQL GROUP BY查询):

qs = MyModel.objects.values('grouped_field').annotate(sum=Sum('duration'))

无论哪种方式,要将这些转换为timedeltas,您可以迭代查询集并修改实例:

for obj in qs:
    obj._timedelta = timedelta(microseconds=obj.sum)

看看这段代码我觉得我更喜欢把它作为模型的属性,例如:

class MyModel(models.Model):
    # ...

    @property
    def timedelta(self):
        try:
            return timedelta(microseconds=self.sum)
        except AttributeError:
            # instance was not annotated (from a regular queryset)
            return None

然后你不需要在查询集上做额外的循环。