2017-05-11 4 views
0

Ich habe einen Serializer, der eine verschachtelte Beziehung hat, wo 4 zusätzliche Tabellen abgerufen werden müssen, die eine Schleife innerhalb der Schleife innerhalb der Schleife erstellen können und der Django ORM ist faul. Ich dachte, setup_eager_loading zu verwenden, um die Leistung zu verbessern.richtige Verwendung von setup_eager_loading

Ich habe einen Eagerloadingmixin wie folgt

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) 

Wie kann ich in meinem APIView verwenden diese, wenn ich nicht get_queryset Methode überschrieben bin?

Antwort

0

könnten Sie es verwenden, wenn immer die rents queryset:

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

Diese sicher eifrig Laden machen wird sowohl für Listen- und Detailansichten.

+0

Auf diese Weise zeigt meine API nicht Besitzer, Galerie und Eigenschaft_Category Feld. – Serenity

+0

Ich bekomme keinen Fehler, aber diese Felder werden nicht angezeigt, die in SELECT_RELATED und PREFETCH_RELATED – Serenity

+0

Sie müssen auf dem Serialisierer deklariert werden (ich sehe, sie sind kommentierte Ihr Beispiel). –

Verwandte Themen