1

使用这样定义的模型:

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)

这给了我一个事件类型的字典(短版本)和运动员获胜的次数。然而,这就是它给我的全部。如果我想深入研究其中一个事件以找到距离甚至只是详细的类型名称,我做不到。

我是否以正确的方式解决这个问题?我怎样才能对事件进行分组,而且还可以访问它们的所有字段?

4

1 回答 1

1

您没有获得事件实例,因为您正在使用values方法查询 Event.objects。这将为您提供仅指定字段的数据: https ://docs.djangoproject.com/en/dev/ref/models/querysets/#values

使用 Django ORM 执行这种分组并不简单。建议的解决方案通常是:

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

但我宁愿用直接的python来做。也许像

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)
于 2014-03-18T21:41:51.897 回答