Попытка отобразить общее количество_вон для каждого пользователя в базе данных через цикл For - PullRequest
0 голосов
/ 20 января 2012

Я пытаюсь отобразить сумму суммы_won для каждого имени пользователя в базе данных.Моя база данных:

Таблица ставок

id
player_id
stakes
amount_won
last_play_date

Таблица игроков

id
user_name
real_name
site_played

models.py

class Player(models.Model):
    user_name = models.CharField(max_length=200)
    real_name = models.CharField(max_length=200)
    SITE_CHOICES = (
        ('FTP', 'Full Tilt Poker'),
        ('Stars', 'Pokerstars'),
        ('UB', 'Ultimate Bet'),
    )
    site_played = models.CharField(max_length=5, choices=SITE_CHOICES)
    def __unicode__(self):
        return self.user_name
    def was_created_today(self):
        return self.pub_date.date() == datetime.date.today()

class Stakes(models.Model):
    player = models.ForeignKey(Player)
    stakes = models.CharField(max_length=200)
    amount_won = models.DecimalField(max_digits=12, decimal_places=2)
    last_play_date = models.DateTimeField('Date Last Updated')
    def __unicode__(self):
        return self.stakes

class PlayerForm(ModelForm):
    class Meta:
        model = Player

class StakesForm(ModelForm):
    class Meta:
        model = Stakes

Views.py

def index(request):
    latest_player_list = Player.objects.all().order_by('id')[:20]
    total_amount_won = Stakes.objects.filter(player__user_name='test_username').aggregate(Sum('amount_won'))
    return render_to_response('stakeme/index.html', {
        'latest_player_list':     latest_player_list, 
        'total_amount_won': total_amount_won
     })

и index.html

<h1> Players </h1>

{% if latest_player_list %}
<ul>
{% for player in latest_player_list %}
    <li><a href="/stakeme/{{ player.id }}/">{{ player.user_name }} </a><br>Total Won: {{ total_amount_won }}
</li>
{% endfor %}
</ul>
<br>
{% else %}
<p>No players are available.</p>
{% endif %}

<h3><a href="/stakeme/new/">New Player</a></h3>

Если я оставлю раздел views.py как (player__user_name='test_username'), он отобразит Amount Won:КАЖДОЕ имя пользователя.В идеале я хотел бы, чтобы он отображал сумму выигрыша: для каждого имени пользователя в цикле for и отображал его только как «сумма выигрыша: 4225,00».

Я начинаю понимать, что это слишком над головой, но я прочитал документы, касающиеся различий между совокупностью и аннотацией, и не могу обернуть это вокруг.Я думаю, что моя БД не настроена правильно, чтобы использовать аннотирование для этого, но я, очевидно, могу ошибаться.

1 Ответ

2 голосов
/ 20 января 2012

Выезд: https://docs.djangoproject.com/en/dev/topics/db/aggregation/

players = Player.objects.annotate(total_amount_won=Sum('stakes__amount_won'))

players[0].total_amount_won # This will return the 'total amount won' for the 0th player

Таким образом, вы можете передать players вашему шаблону и выполнить цикл по нему.

EDIT

Ваш views.py будет выглядеть так:

def index(request):
    players = Player.objects.annotate(total_amount_won=Sum('stakes__amount_won'))
    return render_to_response('stakeme/index.html', {'players': players,})

Шаблон будет выглядеть так:

<h1> Players </h1>
{% if players %}
<ul>
{% for player in players %}
<li>
    <a href="/stakeme/{{ player.id }}/">{{ player.user_name }} </a><br>Total Won: {{ player.total_amount_won }}
</li>
{% endfor %}
</ul>    
<br />
{% else %}
<p>No players are available.</p>
{% endif %}
<h3><a href="/stakeme/new/">New Player</a></h3>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...