在 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
忘记先通过玩家访问球队,然后才能访问该属性。多
我在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
忘记先通过玩家访问球队,然后才能访问该属性。多