Python Django中一对多的预回迁行为不符合预期
我在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_
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