【问题标题】:How to get the sum of a field in Django如何在Django中获取字段的总和
【发布时间】:2019-09-26 12:55:17
【问题描述】:

如何呈现特定字段值的总计?如您所见,我在这里使用反向关系,因为我有一个外键(我不确定这是否会有所不同)。例如,如果我想要 'ab' 字段中的值的总和,我会怎么做。我知道我必须使用聚合或注释方法。在我的特定情况下会是什么样子?

models.py

class Batting(models.Model):
    id = models.IntegerField(db_column='ID', primary_key=True)
    playerid = models.ForeignKey('PlayerLkup', models.DO_NOTHING, db_column='playerID', blank=True, null=True)
    g = models.IntegerField(db_column='G', blank=True, null=True
    ab = models.IntegerField(db_column='AB', blank=True, null=True)
    year = models.IntegerField(db_column='Year', blank=True, null=True) 
    complete_name = models.CharField(max_length=50, blank=True, null=True)

class PlayerLkup(models.Model):
    playerid = models.CharField(db_column='playerID', primary_key=True, max_length=255)
    birthday = models.IntegerField(db_column='birthDay', blank=True, null=True)
    namefirst = models.CharField(db_column='nameFirst', max_length=255, blank=True, null=True)
    namelast = models.CharField(db_column='nameLast', max_length=255, blank=True, null=True)

views.py

from django.shortcuts import render
from .models import PlayerLkup


def player_info(request, playerid):
    playerdata = PlayerLkup.objects.get(playerid=playerid)
    battingstats = playerdata.batting_set.all()
    return render(request, 'careerstats/playerpage.html', {'playerdata': playerdata, 'battingstats': battingstats})

【问题讨论】:

    标签: python django


    【解决方案1】:

    你可以尝试通过以下方式聚合

    from django.db.models import Sum
    result = Batting.objects.aggregate(sum_of_ab=Sum("ab"))
    print result["sum_of_ab"]
    

    要获取与特定玩家关联的所有ab 字段的总和,您可以修改查询以首先过滤

    from django.db.models import Sum
    
    playerdata = PlayerLkup.objects.get(playerid=playerid)
    result = Batting.objects.filter(playerid=playerdata).aggregate(sum_of_ab=Sum("ab"))
    print result["sum_of_ab"]
    

    【讨论】:

      【解决方案2】:

      这是你的意思吗? Batting模型中每个对象的所有AB整数之和?

      from django.shortcuts import render
      from .models import PlayerLkup, Batting
      
      
      def player_info(request, playerid):
          count = 0
          foo = Batting.objects.filter(playerid=playerid)
          for x in foo:
              count += int(x.ab)
          return render(request, 'careerstats/playerpage.html', {'playerdata': playerdata, 'battingstats': battingstats, 'count':count})
      

      【讨论】:

        【解决方案3】:

        文档中有一个可能适合此处的注释示例 -

        total_ab = PlayerLkup.objects.get(playerid=playerid).annonate(total_ab=Sum('batting__ab'))
        

        警告!)我没有测试过这个。

        查看示例here 了解更多信息。

        【讨论】:

          【解决方案4】:
          player = PlayerLkup.objects.get(playerid='FILL IN ID OF PLAYER HERE')
          player_abs = Batting.objects.filter(playerid=player).values('ab')
          

          我很确定您不需要执行任何类似 SUM 或 COUNT 的操作来简单地检索一个值。

          另外,您可能会混淆外键和多对多...

          您的视图可能只是这样:

          def player_info(request, playerid):
              player = PlayerLkup.objects.get(playerid=playerid)
              player_stats = Batting.objects.get(playerid=player)
              player_abs = player_stats.ab
              # below line should be same value as above
              player_abs = Batting.objects.filter(playerid=player).values('ab')
              context = {
                  'player': player,
                  'player_stats': player_stats,
                  'player_abs': player_abs
              }
              return render(request,'careerstats/playerpage.html', context)
          

          【讨论】:

            猜你喜欢
            • 2015-08-07
            • 2019-04-17
            • 2018-11-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-07-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多