Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中一对多的预回迁行为不符合预期_Python_Django_One To Many_Prefetch - Fatal编程技术网

Python Django中一对多的预回迁行为不符合预期

Python Django中一对多的预回迁行为不符合预期,python,django,one-to-many,prefetch,Python,Django,One To Many,Prefetch,我在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_

我在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')
    )
以及:

以及:

我在适当的管理页面上使用这个。 但是,
所有团队成员都未按预期填充。我没有得到任何价值
player.all\u team\u players.all()
没有给我任何东西

当然,另一种选择是在我需要的任何地方使用
player.team.players.all()
,这很有效。但我正试图通过预取来提高性能


我想知道我在这里遗漏了什么吗?

我想出来了——很简单。第一个和第二个预取语句很好。然而,我访问它们的方式并非如此。应该这样访问:

player.team.all_team_players
忘记先通过玩家访问团队,然后才能访问属性。Doh

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)
        )
player.team.all_team_players