2017-12-22 13 views
0

입니다 최적화 :내가 궁금하네요

시리얼 :

class SerializerA(serializers.ModelSerializer): 
    class Meta: 
     model = Model_A 
     fields = ('id', 'official_name', 'gender') 
     depth = 1 

class SerializerB(serializers.ModelSerializer): 
    user = SerializerA(many=True) 
    class Meta: 
     model = Model_B 
     fields = ('id', 'project_name','project_type', 'project_start_date', 'user') 
     depth = 1 

API를 : 내가 API URL 및 디버깅이 페이지에 가면이와 지금

class ReportAPI(APIView): 
    def get(self, request): 
     all_projects = Model_B.objects.all() 
     project_serializer = SerializerB(all_projects, many=True) 
     return Response(project_serializer.data) 

는 it''l 내가 SQL 쿼리에서 78 번 쿼리있어 보여. 하지만 만약 내가 하나의 필드를 manyto 많은 seriealizer 필드를 'gender', 페이지는 이제 데이터베이스에서 21 시간 만 쿼리하므로, 다시 내 질문은 어떻게이 최적화 할 수 있습니까? 그것은 각 Model_B 개체에 대한 데이터베이스를 공격하지 않도록

답변

1

당신은 (ManyToMany 또는 ManyToOne를 들어) (외래 키에 대한) select_related 및/또는 prefetch_related을 사용할 수 있습니다. 사용자 모델은 당신이 그것의 시리얼에 필요한 다른 FK를 가지고 있다면 당신은 또한 select_related('user', 'user__other_field')을 할 수

class ReportAPI(APIView): 
    def get(self, request): 
     all_projects = Model_B.objects.all().select_related('user') 
     project_serializer = SerializerB(all_projects, many=True) 
     return Response(project_serializer.data) 

:

user 경우에 당신이 할 수있는 Model_B에서 FK이다.

+0

감사합니다. 도움을 많이 주셔서 감사합니다. @Gabriel, 내 쿼리가 78에서 10까지 사용했습니다. 덕분에 다시 감사드립니다 !! –