2017-05-11 4 views
0

루프 내부에 루프를 생성 할 수있는 추가 테이블 4 개를 가져와 django ORM을 지연시킬 수있는 중첩 관계가있는 serializer가 있습니다. 나는 성능을 향상시키기 위해 setup_eager_loading을 사용하는 것을 고려했다. setup_eager_loading의 적절한 사용

난 내가 get_queryset 메서드를 재정하고 있지 않다 경우
class EagerLoadingMixin: 
    @classmethod 
    def setup_eager_loading(cls, queryset): 
     if hasattr(cls, "SELECT_RELATED"): 
      queryset = queryset.select_related(*cls.SELECT_RELATED) 
     if hasattr(cls, "PREFETCH_RELATED"): 
      queryset = queryset.prefetch_related(*cls.PREFETCH_RELATED) 
     return queryset 


class RentSerializer(serializers.ModelSerializer, EagerLoadingMixin): 
    #owner = serializers.SerializerMethodField() 
    timeLaps = serializers.SerializerMethodField() 
    #gallery = GallerySerializer(read_only=True, many=True) 
    #property_category = CategorySerializer() 
    SELECT_RELATED = ['owner',] 
    PREFETCH_RELATED = ['gallery', 'property_category', ] 
    class Meta: 
     model = Rental 
     read_only = ('id', 'token', 'created_on', 'modified_on', 'slug',) 
     fields = ('__all__') 


class Rent(APIView): 
    """ 
    List all the rents if token is not provided else a token specific rent 
    """ 
    serializer_class = RentSerializer 
    def get(self, request, token=None, format=None): 
     reply={} 
     try: 
      rents = Rental.objects.all() 
      if token: 
       rent = Rental.objects.get(token=token) 
       reply['data'] = self.serializer_class(rent).data 
      else: 
       reply['data'] = self.serializer_class(rents, many=True).data 
     except Rental.DoesNotExist: 
      return error.RequestedResourceNotFound().as_response() 
     except: 
      return error.UnknownError().as_response() 
     else: 
      return Response(reply, status.HTTP_200_OK) 

어떻게 내가 내 APIView이 사용할 수에 따라 같은 Eagerloadingmixin이? rents의 검색어를 가져올 때

답변

0

당신은 그것을 사용할 수 있습니다

rents = Rental.objects.all() 
    rents = self.serializer_class.setup_eager_loading(rents) 

이 확실 열망로드 목록 및 세부 뷰 모두 사용하게됩니다.

+0

내 API는 소유자, 갤러리 및 property_category 필드를 표시하지 않습니다. – Serenity

+0

오류가 발생하지는 않지만 해당 필드는 SELECT_RELATED 및 PREFETCH_RELATED 안에 표시되지 않습니다. – Serenity

+0

이들은 serializer에서 선언해야합니다 (예를 들어 주석이있는 것을 볼 수 있습니다). –