Джанго - как выбрать уникальные значения в цв - PullRequest
0 голосов
/ 17 мая 2011

У меня есть небольшая проблема с Django, которую я не могу решить. Предположим, у меня есть такие модели:

class Game(models.Model):
# some attributes here

class Score(models.Model):
user = models.ForeignKey(User)
game = models.ForeignKey(Game)
val = models.IntegerField()
#...

Теперь я хочу сохранить в БД все результаты прошлых игр, но когда нужно показать их значения на странице, я хочу выбрать только лучший результат для выбранного игрока в каждой игре. Как я могу это сделать? Или, может быть, мне нужно изменить модель счета?

Ответы [ 4 ]

2 голосов
/ 17 мая 2011

В зависимости от вашей версии Django, вы можете сделать это:

from django.db.models import Max
player = User.objects.filter(username='user')
best_score = Score.objects.filter(user=player).aggregate(Max('val'))
0 голосов
/ 18 мая 2011

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

Мое решение делает то, что я хотел, чтобы:

user_id = req.GET['user_id']
player = User.objects.get(id__exact=user_id)
scores = score.objects.filter(user=player).values('game').order_by('game').annotate(best=Max('score'))
0 голосов
/ 17 мая 2011

Поскольку вы пытаетесь сделать это для отображения, я, вероятно, превратил бы его в шаблонный фильтр ...

@register.filter    
def highest_score(user, game):
  scores = Score.objects.filter(game=game, user=user).order_by("val")
  return scores[0]

Вам понадобится проверить некоторые ошибки втам, очевидно.Например, вы захотите убедиться, что набор запросов "scores" действительно имеет результаты.

Но затем вы можете использовать его в таком шаблоне:

<p>{{ user }}'s top score: {{ user|highest_score:game }}</p>
0 голосов
/ 17 мая 2011

Для этого вы можете использовать функцию Django Max

from django.db.models import Max
_user = User.objects.get(...)
_game = Game.objects.get(...)
score = Score.objects.filter(user=_user,game=_game)
max_score = score.aggregate(Max('val'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...