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)
4 Réponses :
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"]
Merci. Je vais essayer
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})
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.
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)