2017-11-28 22 views
0

내가 예를 들어, 장고 간단한 일대 다 관계가 예상대로 작동하지에 : 플레이어의 관리자 페이지 (들)에프리 페치는 일대 장고는

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', 
    ) 

, I 팀에 다른 플레이어에 대한 정보를 포함하여 팀이있는 경우 해당 플레이어와 관련된 팀에 대한 정보를 표시하려고합니다. 모든 관련 플레이어에 대한 프리 페치를 사용하여이 쿼리를 현재 플레이어 팀에 최적화하려고합니다. 이 작업은 매우 간단해야하지만 올바른 프리 페치를 수행 할 수 없습니다.

는 여기에 내가 무엇을 시도했다입니다 :

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()을 사용하는 것입니다. 하지만 프리 페치로 성능을 얻으려고합니다.

내가 여기에없는 것에 대한 아이디어가 있습니까?

답변

0

나는 그것을 알아 냈다. 첫 번째 및 두 번째 프리 페치 문은 훌륭합니다. 그러나 내가 그들에게 접근하는 방식은 그렇지 않았습니다. 과 같이 액세스가 있어야합니다

player.team.all_team_players 

가 플레이어를 통해 처음으로 팀에 액세스하는 것을 잊었다, 다음 속성에 액세스 할 수 있습니다. 도우