由于您的CombineResults模型与CombineEvents有一个FK关系,您可以这样做:combine_events = CombineEvents.objects.filter(team__id=team_id)
for event in combine_events:
result = event.combineresults_set.order_by('-result')[0]
combineresults_set属性是由FK字段自动生成的,但是可以通过指定related_name关键字参数将其设置为更有用的值:
^{pr2}$
注意,这不是对数据库最友好的方法,因为您将有效地访问数据库一次以获得combine_events(一旦开始迭代),然后再次访问该列表中的每个事件。使用prefetch_related()可能会更好,您可以使用它来进行两个DB查询。文档可以是found here。在
但是,prefetch_related()将默认对相关文档执行queryset.all(),您可以通过使用Prefetch对象作为documented here来进一步控制。在
编辑:
抱歉把问题弄错了。获得每个用户在每个事件中的最佳结果(这是我认为您想要的)并不是那么简单。我可能会这样做:from django.db.models import Q, Max
combine_events = CombineEvents.objects \
.filter(team_id=team_id) \
.prefetch_related('combineresults_set')
for event in combine_events:
# Get the value of the best result per user
result = event.combineresults_set.values('user').annotate(best=Max('result'))
# Now construct a Q() object, note this will evaluate the result query
base_q = Q()
for res in result:
# this is the equivalent to base_q = base_q | ....
base_q |= (Q(user_id=res['user']) & Q(result=res['best']))
# Now you're ready to filter results
result = event.combineresults_set.filter(base_q)
您可以阅读更多关于Q对象here,或者使用RawSQL等编写自己的SQL。或者等待有更好主意的人。。在