选择和过滤相关模型

时间:2019-08-24 11:09:59

标签: django-models django-queryset

我有以下型号:

class Competition(models.Model):
    # ...

class Result(models.Model):
    # ...
    competition = ForeignKey(Competition, on_delete=models.CASCADE,
                             related_name='individual_results',
                             related_query_name='individual_results')
    athlete = ForeignKey(Athlete, on_delete=models.CASCADE)

class Athlete(models.Model):
    # ...

我想做的是为每个运动员创建一个概览,并显示按比赛分组的那个运动员的结果。

尝试过这样的事情:

athlete = Athlete.objects.get(pk=1)
competitions = Competition.objects
                .prefetch_related('individual_results')
                .filter(individual_results__athlete=athlete)

但是当我在模板中执行competition.indvidual_results.all时,它会显示比赛的所有结果,而不仅仅是该运动员的结果。

1 个答案:

答案 0 :(得分:1)

.filter(..)不会过滤相关的经理。汇总时,可以使用它进行过滤,但预取管理器中的项目则不能进行过滤。

不过,您可以使用Prefetch object [Django-doc],例如:

results = Result.objects.filter(athlete_id=1)
competitions = Competition.objects.prefetch_related(
    Prefetch('individual_results', queryset=results, to_attr='athlete_results')
)

现在,带有id=1的运动员的个人成绩存储在此查询集产生的athlete_results中的属性Competition中。