在我的数据库中,我有一张与表金额相关联的桌卡,一张卡可以有多个金额。
因此,使用 django,我尝试获取一张特定的卡并汇总所有链接金额的总和。但不可能将 .get() 和 .annotate 连接在一起。
我试过这个:
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 不作为该对象的方法存在。
但是如何通过注释获取这个对象呢?
谢谢您的回答
交换
annotate
和get
的顺序。
last_year_amount = Card.objects\
.annotate(total=Sum('amount'))\
.get(date__date=date(today.year - 1, today.month, today.day))
您也可以使用
filter()
。
last_year_amount = Card.objects\
.filter(date__date=date(today.year - 1, today.month, today.day))\
.annotate(total=Sum('amount'))\
.get()
如果查询集不包含恰好一项,则最后一个不带参数的
get()
将引发异常。
我尝试过,但又出现了错误。
最后我在Amount.amount和get的格式上出现了错误。
解决方案是:
last_year_amount = Card.objects.filter(date__date=date(today.year - 1, today.month, today.day)).annotate(total=Sum('amount__amount'))[:1].get()
效果非常好
以相反的顺序进行怎么样:
Amount.objects.filter(card__date__date=date(today.year - 1, today.month, today.day)).values('card').annotate(total=Sum('amount'))
我假设
Amount
模型具有 Card
模型的外键,字段名称为 card
。