我正在阅读django duration字段的文档,我无法弄清楚如何用它来注释一组具有持续时间的django对象。文档说db会将持续时间存储为整数并聚合它需要转换为timedelta,如下所示:
timedelta(microseconds=list.aggregate(sum=Sum('duration'))['sum'])
我的问题是我不知道如何将此表达式用作一组django对象的注释。 documentation can be found here
提前致谢。
答案 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
然后你不需要在查询集上做额外的循环。