我正在阅读django持续时间字段的文档,但无法弄清楚如何使用它来注释一组带有持续时间的django对象。文档说,数据库将持续时间存储为整数,并且要进行汇总,需要将其转换为timedelta,如下所示:

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


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

提前致谢。

最佳答案

我不确定如何使用此表达式作为一组Django对象的注释


简短的答案是:您不能。

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

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

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


或者,您可能直接在duration上具有MyModel字段,但正在进行汇总(即,SQL GROUP BY查询):

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


无论哪种方式,要将它们转换为timedelta,都可以遍历queryset并修改实例:

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


然后,您不需要对查询集进行额外的循环。

关于python - 使用django 1.8持续时间字段注释一组django对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31814405/

10-13 07:21
查看更多