1
votes

Comment obtenir la somme d'un champ dans Django

Comment afficher le total des valeurs d'un champ particulier? Comme vous pouvez le voir, j'utilise des relations inverses ici parce que j'ai une clé étrangère (je ne sais pas si cela fait une différence). Par exemple, que ferais-je si je voulais le total des valeurs dans le champ 'ab' . Je sais que je dois utiliser la méthode d'agrégation ou d'annotation. À quoi cela ressemblerait-il dans ma situation particulière?

models.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})

views.py p>

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)


0 commentaires

4 Réponses :


2
votes

Vous pouvez essayer d'agréger de la manière suivante

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"]

Pour obtenir la somme de tous les champs ab associés à un lecteur particulier, vous pouvez modifier la requête à filtrer en premier

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


1 commentaires

Merci. Je vais essayer



0
votes

Est-ce ce que vous voulez dire? La somme de tous les entiers AB pour chaque objet du modèle Batting?

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})


0 commentaires

0
votes

Il y a un exemple d'annotation dans la documentation qui pourrait tenir ici -

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

( Attention! ) Je n'ai pas testé cela.

Regardez l'exemple ici pour plus d'informations.


0 commentaires

0
votes
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 commentaires