使用 django 1.8 持续时间字段注释一组 django 对象

Using django 1.8 duration field to annotate a set of django objects

我正在阅读 Django 持续时间字段的文档,但我不知道如何使用它来用持续时间来注释一组 Django 对象。文档说 db 将持续时间存储为整数并聚合它需要像这样转换为 timedelta:

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

我的问题是我不确定如何使用此表达式作为一组 django 对象的注释。 documentation can be found here

提前致谢。

I am not sure how to use this expression as an annotation for a set of django objects

简短的回答是:你不能。

如果你在谈论用总和注释查询集,那么我假设 duration 字段在相关模型上(通过多对多或反向外键关系)并且你想获得父模型每一行的持续时间总和。

您可以使用以微秒为单位的 int 持续时间值来注释查询集,如下所示:

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

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

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

无论哪种方式,要将它们转换为时间增量,您可以遍历查询集并修改实例:

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

那么你不需要对查询集做额外的循环。