在 Django 中预取一对多的行为不符合预期

Prefetch on a one-to-many in Django not behaving as expected

我在Django中有一个简单的一对多关系,例如:

class Team(models.Model):

    team_mascot = models.CharField(
        max_length=200, null=True)

class Player(models.Model):

    first_name = models.CharField(max_length=200, null=True)
    last_name = models.CharField(max_length=200, null=True)

    team = models.ForeignKey(
        'players.Team',
        blank=True, null=True,
        on_delete=models.SET_NULL,
        related_name='players',
        related_query_name='player',
    )

在玩家管理页面上,如果玩家有团队,我想显示与该玩家关联的团队的一些信息,包括该团队中其他玩家的信息。我想通过预取当前球员球队的所有相关球员来优化此查询。这应该相当简单,但我似乎无法获得正确的预取。

这是我尝试过的方法:

def prefetch_all_team_players(self):

  return self.prefetch_related(
    Prefetch('team__players', to_attr='all_team_players')
    )

和:

def prefetch_all_team_players(self):
    return self.select_related('team').prefetch_related(
        Prefetch(
            'team__players',
            to_attr='all_team_players'
        )
    )

和:

def prefetch_all_team_players(self):
    from myproj.players.models import Team

    team_queryset = Team.objects.all()
    return self.prefetch_related(
        Prefetch('team__players', to_attr='all_team_players', queryset=team_queryset)
        )

我在相应的管理页面上使用它。 但是,all_team_players 未按预期填充。我没有得到任何价值。 player.all_team_players.all() 没有给我任何东西。

替代方案当然是在我需要的地方使用 player.team.players.all(),这很有效。但我正在尝试通过预取获得性能。

关于我在这里遗漏的任何想法?

我想通了 - 非常简单。第一个和第二个预取语句就好了。但是我访问它们的方式不是。应该这样访问:

player.team.all_team_players

忘记先通过玩家访问球队,然后才能访问该属性。多