【问题标题】:How can i sum the content of a django model我如何总结 django 模型的内容
【发布时间】:2017-07-10 08:26:03
【问题描述】:

我有这个模型:

class Transfer(models.Model):
        transfer_code = models.CharField(max_length=30, blank=True, null=True)
        sender_name = models.CharField(max_length=30, blank=True, null=True)
        amount = models.IntegerField(blank=True, null=True)
        recipient_name = models.CharField(max_length=30, blank=True, null=True)
        time_sent = models.DateTimeField(auto_now_add=True, auto_now=False)
        received = models.BooleanField(default=False)
        time_received = models.DateTimeField(auto_now_add=False, auto_now=False, null=True)

        def __unicode__(self):
            return self.transfer_code

这是我要计算表中总金额的视图:

def listtransfersall(request):
    title = 'ALL TRANSFERS'
    queryset = Transfer.objects.all()
    for instance in queryset:
        total = 0
        total += instance.amount
        print total

    context = {
    "title": title,
    "queryset": queryset,
    "total": total,
    }
    return render(request, "listtransfersall.html",context)

这会单独打印表格中的金额。 如何获取总数并将其分配给总变量?

【问题讨论】:

    标签: python django sum calculation


    【解决方案1】:

    在您发布的代码中,您每次通过循环设置total = 0

    for instance in queryset:
        total = 0
        total += instance.amount
        print total
    

    将该行移到循环之外,这将按照您的预期工作。

    获得values_list 并总结如下:

    amounts = Transfer.objects.values_list('amount', flat=True)
    total = sum(amounts)
    

    最好还是让数据库完成工作并使用 Sum 聚合:

    from django.db.models import Sum
    total = Transfer.objects.aggregate(Sum("amount"))
    

    有关聚合的更多信息,请参阅documentation

    【讨论】:

      【解决方案2】:

      您可以为此使用annotate。在你的情况下,试试这个:

      from django.db.models import Sum
      
      queryset = Transfer.objects.annotate(total_amount=Sum('amount'))
      

      然后在你的模板中使用:

      queryset.total_amount
      

      【讨论】:

        【解决方案3】:

        我不确定我是否完全理解了您的问题,但我认为您的问题是您在循环中声明了total = 0。因此,在每次迭代中添加 instance.amount 的值之前,它始终为 0。

        你必须在进入循环之前声明total = 0,像这样

        total = 0
        for instance in queryset:
            total += instance.amount
        print total
        

        该代码会将instance.amount 添加到total 变量并打印总值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-19
          • 2022-11-17
          • 1970-01-01
          • 1970-01-01
          • 2019-01-23
          • 2012-05-21
          • 2016-11-29
          • 1970-01-01
          相关资源
          最近更新 更多