【问题标题】:Annotate and .get() in Django在 Django 中注释和 .get()
【发布时间】:2018-08-04 12:23:01
【问题描述】:

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

因此,我尝试使用 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' object has no attribute 'annotate''。 我知道 .get() 返回一个对象而不是 QuerySet,所以 .annotate 不作为该对象的方法存在。

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

感谢您的回答

【问题讨论】:

    标签: django python-3.x django-models django-views


    【解决方案1】:

    交换annotateget的顺序。

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

    【讨论】:

      【解决方案2】:

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

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

      效果很好

      【讨论】:

        【解决方案3】:

        倒过来怎么样:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-06
          • 2018-01-20
          • 2021-06-05
          • 2021-11-03
          • 2018-10-07
          • 2022-12-07
          相关资源
          最近更新 更多