使用 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
那么你不需要对查询集做额外的循环。
我正在阅读 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
那么你不需要对查询集做额外的循环。