Группировка агрегации запросов 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)