Группировка агрегации запросов django с доступом ко всем полям

С моделями, определенными так:

class Athlete(models.Model):
    name = models.CharField()

class Event(models.Model):
    winner = models.ForeignKey(Athlete)
    distance = models.FloatField()

    type_choices = [('LJ', 'Long Jump'), ('HJ', 'High Jump')]
    type = models.CharField(choices=type_choices)

Я хочу выполнить запрос, выбирая все события и Athlete выиграл, сгруппированы по типу. Я сейчас делаю это так:

athlete = Athlete.objects.get(name='dave')
events_by_type = Events.objects.values('type').annotate(Count('winner')).filter(winner=athlete)

Это дает мне словарь типов событий (короткие версии) и количество раз, когда спортсмен был победителем. Однако это все, что мне дает. Если я затем захочу покопаться в одном из этих событий, чтобы найти расстояние или даже просто подробное имя типа, я не смогу.

Я иду об этом в правильном направлении? Как можно сгруппировать события, а также получить доступ ко всем их полям?

1 ответ

Решение

Вы не получаете экземпляры события, потому что запрашиваете объекты Event.object с помощью метода значений. Это предоставит вам данные только для указанных полей: https://docs.djangoproject.com/en/dev/ref/models/querysets/

Выполнение такого рода групп с помощью Django ORM не так просто. Предлагаемое решение часто представляет собой:

q = Events.objects.filter(winner=athlete)
q.query.group_by = ['type']
q.count()

Но я бы предпочел сделать это с прямым питоном. Может быть что-то вроде

athlete = Athlete.objects.get(name='dave')
events = Events.objects.filter(winner=athlete)
won_per_type = defaultdict(list)
for e in events:
    won_per_type(e.type).append(e)
Другие вопросы по тегам