2017-05-11 14 views
0

ループ内にループを作成し、django ORMが遅延する4つの追加テーブルをフェッチする必要があるネストされた関係を持つシリアライザがあります。私は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がありますか?

答えて

0

rentsクエリセットを取得するときは、それを使用することができます:

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

これは、積極的なロードの両方のリストと詳細ビューのために使用されていることを確認します。

+0

この方法では、私のAPIは所有者、ギャラリー、property_categoryフィールドを表示しません。 – Serenity

+0

私はエラーは表示されませんが、これらのフィールドはSELECT_RELATEDとPREFETCH_RELATEDの中に表示されません – Serenity

+0

シリアライザで宣言する必要があります(例ではコメントが表示されています)。 –