나는 팀이 스포츠 리그에서 수행하는 방법에 대한 세부 사항을 표시하는 데 사용하는 시리얼 ..SerializerMethodFields간에 쿼리 세트를 공유하는 방법은 무엇입니까?
class TeamLeagueSerializer(ModelSerializer):
class Meta:
model = Team
fields = [...]
games_played = fields.SerializerMethodField()
games_won = fields.SerializerMethodField()
games_lost = fields.SerializerMethodField()
points_for = fields.SerializerMethodField()
...etc...
def fixtures(self, team):
# Retrieves all relevant fixtures for a given season and a given team
return Fixture.objects.filter(Q(home_team=team) | Q(away_team=team), season=self.season)
def get_games_won(self, obj):
home_results = Q(home_team=obj, result__home_team_score__gt=F('result__away_team_score'))
away_results = Q(away_team=obj, result__away_team_score__gt=F('result__home_team_score'))
results = self.fixtures(obj).filter(home_results | away_results)
return results.count()
def get_games_lost(self, obj):
home_results = Q(home_team=obj, result__home_team_score__lt=F('result__away_team_score'))
away_results = Q(away_team=obj, result__away_team_score__lt=F('result__home_team_score'))
results = self.fixtures(obj).filter(home_results | away_results)
return results.count()
이이 모두 제대로 작동하지만 8 개 팀의 리그를 위해,이 약 5 초 정도 걸릴 수 있습니다 각 SerializerMethodField
은 완료된 개별 쿼리입니다.
이 코드의 비 API 버전은 개별 쿼리가 아닌이 serializer가 만드는 각 속성에 주석을 달아주는 단일 쿼리 세트로 훨씬 간단합니다.
주어진 serializer에 대해 동일한 작업을 수행하고 여러 쿼리 대신 하나의 쿼리에서 serializer 데이터를 구성 할 수 있습니까? 가능한 해결책의
물론 이죠! 나는 진지하게 viewset보다는 serializer에서 사용 가능한 것을 사용하려고 노력함으로써 지나치게 복잡하게 만들었습니다 ... 아쉽게도 나중에 시도해보고이를 받아들이십시오 .... – Sayse