我正在阅读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/