Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用django 1.8 duration字段注释一组django对象_Python_Django_Django Models_Django Admin - Fatal编程技术网

Python 使用django 1.8 duration字段注释一组django对象

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对象的注释 简单的回答是:你不能 如

我正在阅读django duration字段的文档,不知道如何使用它来注释一组django对象的duration。文档中说,db将持续时间存储为整数,要进行聚合,需要将其转换为timedelta,如下所示:

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
字段,但正在聚合(即SQL
GROUP 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