Django 中的 QuerySet.annotate() 和 .get()

问题描述 投票:0回答:3

在我的数据库中,我有一张与表金额相关联的桌卡,一张卡可以有多个金额。

因此,使用 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 不作为该对象的方法存在。

但是如何通过注释获取这个对象呢?

谢谢您的回答

django python-3.x django-models django-views
3个回答
3
投票

交换

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()
将引发异常。


0
投票

我尝试过,但又出现了错误。

最后我在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()

效果非常好


0
投票

以相反的顺序进行怎么样:

Amount.objects.filter(card__date__date=date(today.year - 1, today.month, today.day)).values('card').annotate(total=Sum('amount'))

我假设

Amount
模型具有
Card
模型的外键,字段名称为
card

© www.soinside.com 2019 - 2024. All rights reserved.