gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:15 25 4
gpt4 key购买 nike

我正在阅读 django 持续时间字段的文档,但我不知道如何使用它来注释一组带有持续时间的 django 对象。文档说数据库将持续时间存储为整数,并且要聚合它需要将其转换为 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

那么您不需要对查询集进行额外的循环。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com