首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django中的Annotate和.get

Django中的Annotate和.get
EN

Stack Overflow用户
提问于 2018-08-04 20:23:02
回答 3查看 2.7K关注 0票数 0

在我的数据库中,我有一个表卡链接到一个表金额,一张卡可以有许多金额。

因此,对于django,我尝试获得一张特定的卡,并汇总所有相关金额的总和。但是不可能将.get()和.annotate连接在一起。

我试过这个:

代码语言:javascript
复制
    last_year_amount = Card.objects.get(date__date=date(today.year - 1, 
    today.month, today.day)).annotate(total=Sum(Amount.amount))

但当然,它会引发错误“Card”对象没有属性“annotate”。我知道.get()返回的是一个对象,而不是QuerySet,所以.annotate不会作为这个对象的方法存在。

但是如何使用注解来获取这个对象呢?

感谢您的回答

EN

回答 3

Stack Overflow用户

发布于 2018-08-04 20:26:07

交换annotateget的顺序。

代码语言:javascript
复制
 last_year_amount = Card.objects\
   .annotate(total=Sum('amount'))\
   .get(date__date=date(today.year - 1, today.month, today.day))

您也可以使用filter()

代码语言:javascript
复制
 last_year_amount = Card.objects\
   .filter(date__date=date(today.year - 1, today.month, today.day))\
   .annotate(total=Sum('amount'))\
   .get()

如果查询集不只包含一项,则不带参数的最终get()将引发异常。

票数 1
EN

Stack Overflow用户

发布于 2018-08-04 20:36:15

我试过了,但有另一个错误。

最后,我在Amount.amount和get格式中遇到了错误。

解决方案是:

代码语言:javascript
复制
    last_year_amount = Card.objects.filter(date__date=date(today.year - 1, today.month, today.day)).annotate(total=Sum('amount__amount'))[:1].get()

它工作得非常好

票数 0
EN

Stack Overflow用户

发布于 2018-08-04 20:48:17

不如按相反的顺序来:

代码语言:javascript
复制
Amount.objects.filter(card__date__date=date(today.year - 1, today.month, today.day)).values('card').annotate(total=Sum('amount'))

我假设Amount模型有一个指向Card模型的外键,字段名为card

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51685516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档