Как получить сумму поля в Джанго - PullRequest
1 голос
/ 08 мая 2019

Как бы вывести итоги для значений определенного поля? Как вы можете видеть, я использую обратные отношения здесь, потому что у меня есть внешний ключ (я не уверен, что это имеет значение). Например, что бы я сделал, если бы я хотел получить сумму значений в поле '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})

Ответы [ 4 ]

2 голосов
/ 08 мая 2019

Вы можете попробовать агрегировать следующим образом

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"]
0 голосов
/ 08 мая 2019
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)
0 голосов
/ 08 мая 2019

В документации есть пример аннотации, который может здесь поместиться -

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

( Внимание! ) Я не проверял это.

Смотрите пример здесь для получения дополнительной информации.

0 голосов
/ 08 мая 2019

Это то, что вы имеете в виду? Сумма всех целых чисел 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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...