Python 使用django 1.8 duration字段注释一组django对象
我正在阅读django duration字段的文档,不知道如何使用它来注释一组django对象的duration。文档中说,db将持续时间存储为整数,要进行聚合,需要将其转换为timedelta,如下所示:Python 使用django 1.8 duration字段注释一组django对象,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,我正在阅读django duration字段的文档,不知道如何使用它来注释一组django对象的duration。文档中说,db将持续时间存储为整数,要进行聚合,需要将其转换为timedelta,如下所示: timedelta(microseconds=list.aggregate(sum=Sum('duration'))['sum']) 我的问题是,我不确定如何将此表达式用作一组django对象的注释。 提前谢谢 我不知道如何将此表达式用作一组django对象的注释 简单的回答是:你不能 如
timedelta(microseconds=list.aggregate(sum=Sum('duration'))['sum'])
我的问题是,我不确定如何将此表达式用作一组django对象的注释。
提前谢谢
我不知道如何将此表达式用作一组django对象的注释
简单的回答是:你不能
如果您正在谈论用总和来注释查询集,那么我假设duration
字段位于相关模型上(通过多对多或反向外键关系),并且您希望获得父模型每一行的持续时间总和
可以使用int duration值以微秒为单位对queryset进行注释,如下所示:
qs = MyModel.objects.annotate(sum=Sum('related_model__duration'))
或者,您可以在MyModel
上直接设置duration
字段,但正在聚合(即SQLGROUP BY
查询):
无论采用哪种方式,要将它们转换为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
然后,您不需要在查询集上执行额外的循环。如果不需要,您可以使用微秒int值对查询集进行注释,但您必须在查询集上进行迭代,并应用上述转换以获取timedelta ObjectsHanks以获得快速答案。我想我不明白我贴在那里的代码。你能给我举个例子吗。我在list.Nevermind中找不到聚合方法。我道歉。我现在明白了,聚合是queryset的方法,而不是list的方法。由于单词list在他们的网站上是彩色编码的,我认为他们指的是list的实际方法,而不是我必须用queryset对象替换list。谢谢你的帮助。此外,没有必要进行转换。django足够聪明,可以将时间增量正确显示为持续时间。澄清一下:如果您想要持续时间,则无需进行转换,因为持续时间是存储和返回的时间。如果您想从带注释的持续时间中获取时间增量,则只需转换。感谢您的帮助。你的评论就是我问题的答案。但不确定如何接受评论作为答案。
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