簡體   English   中英

使用django 1.8持續時間字段注釋一組django對象

[英]Using django 1.8 duration field to annotate a set of django objects

我正在閱讀django持續時間字段的文檔,但無法弄清楚如何使用它來為一組django對象添加持續時間。 文檔說數據庫將持續時間存儲為整數,並且要進行匯總,需要將其轉換為timedelta,如下所示:

timedelta(microseconds=list.aggregate(sum=Sum('duration'))['sum'])

我的問題是我不確定如何使用此表達式作為django對象集的注釋。 文檔可以在這里找到

提前致謝。

我不確定如何使用此表達式作為django對象集的注釋

簡短的答案是:您不能。

如果您正在談論用總和來注釋查詢集,那么我假設duration字段位於相關模型上(通過多對多或反向外鍵關系),並且您想要獲取持續時間的總和父模型。

您可以使用微秒的int持續時間值注釋查詢集,如下所示:

qs = MyModel.objects.annotate(sum=Sum('related_model__duration'))

或者,您可能直接在MyModelMyModelduration字段,但正在進行匯總(即SQL GROUP BY查詢):

qs = MyModel.objects.values('grouped_field').annotate(sum=Sum('duration'))

無論哪種方式,要將它們轉換為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

然后,您不需要對查詢集進行額外的循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM