[英]Django: Set an alias to the group by (annotate) field of Model.objects.filter
[英]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'))
或者,您可能直接在MyModel
上MyModel
了duration
字段,但正在進行匯總(即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.