You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何为每个Campaign统计总捐赠金额并传递至前端?

如何为每个Campaign添加总捐赠金额并传递到前端?

嗨,我来帮你搞定这个需求!要在landing_page视图里给每个Campaign附上对应的总捐赠金额,最高效的方式是用Django的annotate()和聚合函数,在数据库层面一次性完成计算,避免N+1查询的性能问题。

推荐解决方案:使用annotate聚合查询

直接修改你的视图代码,利用Sum聚合函数,在查询Campaign的时候就把总捐赠额计算出来:

from django.db.models import Sum  # 别忘了导入Sum函数

def landing_page(request):
    # 用annotate为每个Campaign添加total_donation字段,统计关联捐赠的金额总和
    campaigns = Campaign.objects.all().order_by('-id').annotate(
        total_donation=Sum('donation_set__donation_amount')
    )
    
    # 处理没有捐赠的Campaign:把None转为0,避免前端显示异常
    for campaign in campaigns:
        campaign.total_donation = campaign.total_donation or 0
    
    return render(request, 'core/landing_page.html', {'campaigns': campaigns})

代码解释:

  • Sum('donation_set__donation_amount'):因为你的Donation模型里用campaign外键关联到Campaign,且没有指定related_name,所以Django默认的反向关联名称是donation_set。我们通过这个反向关联,聚合所有关联捐赠的donation_amount字段总和。
  • 遍历处理total_donation:如果某个Campaign没有任何捐赠记录,Sum的结果会是None,把它转为0后,前端显示的时候就不会出现空白或者错误。

前端模板使用

在你的landing_page.html里,遍历campaigns的时候,直接调用新增的total_donation字段即可:

{% for campaign in campaigns %}
    <div class="campaign-item">
        <h3>{{ campaign.campaign_title }}</h3>
        <p>总捐赠金额:{{ campaign.total_donation }}</p>
    </div>
{% endfor %}

备选方案:在模型中添加自定义方法(不推荐大量数据场景)

如果你只是小体量数据,也可以在Campaign模型里添加一个方法来计算总捐赠,但这种方法会导致N+1查询(每个Campaign都要单独查一次捐赠表),数据多的时候性能会很差:

# 在Campaign模型中添加方法
from django.db.models import Sum

class Campaign(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    campaign_title = models.CharField(max_length=200, blank=True)
    
    def get_total_donation(self):
        # 聚合当前Campaign的所有捐赠金额,没有的话返回0
        return self.donation_set.aggregate(total=Sum('donation_amount'))['total'] or 0

这种情况下,视图不需要修改,前端直接调用这个方法:

<p>总捐赠金额:{{ campaign.get_total_donation }}</p>

还是强烈推荐第一种annotate的方案,性能更好,更符合Django的最佳实践。

内容的提问来源于stack exchange,提问作者Irfan Harun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:28:15