2017-03-03 19 views
0

我正在使用Django Rest Framework 3,並遇到一些問題。我已經根據this example獲得了自定義分頁工作,並且我已經獲得了一個非orm模型,其工作方式如下:this example。但是,我無法在非orm模型上獲得自定義分頁(或針對此問題的任何分頁)。自定義分頁在settings.py中設置爲默認值,並且它適用於所有帶模型的視圖集。如何使用非orm模型自定義分頁

帶模型端點的JSON輸出包含元信息並嵌套在「對象:」內的對象。沒有模型的端點的JSON輸出只是給出了一個對象列表。我的代碼發佈在下面。任何想法如何讓這個工作?

自定義分頁:

from rest_framework.pagination import LimitOffsetPagination 
from rest_framework.response import Response 

class CustomPagination(LimitOffsetPagination): 
    def get_paginated_response(self, data):  
     return Response({ 
      'meta': { 
       'limit': self.get_limit(self.request), 
       'next': self.get_next_link(), 
       'offset': self.get_offset(self.request), 
       'previous': self.get_previous_link(), 
       'total_count': self.count 
      }, 
      'objects': data 
     }) 

對象:

class EMSEvent(object): 
    def __init__(self, id, name, start, end): 
     self.id = id 
     self.name = name 
     self.start = start 
     self.end = end 

串行:

class EMSEventSerializer(serializers.Serializer): 
    id = serializers.IntegerField() 
    name = serializers.CharField() 
    start = serializers.CharField() 
    end = serializers.CharField() 

    class Meta: 
     fields = '__all__' 

視圖集:

class EMSEventViewSet(viewsets.ViewSet): 
    serializer_class = EMSEventSerializer(many=True) 
    http_method_names = ['get'] 


    def list(self, request): 
     results = [] 
     """ 
     Here is code that opens up a SQL connection, executes a 
     query, then transfers the data into results 
     """ 

     # Always sort results by start time 
     results = sorted(results, key=lambda k: k.start) 
     serializer = EMSEventSerializer(instance=results, many=True) 

     return Response(serializer.data) 

JSON輸出的API端點與型號:

{ 
    meta: { 
     limit: 20, 
     next: "/api/v1/endpoint/?offset=20&limit=20&format=json", 
     offset: 0, 
     previous: null, 
     total_count: 24 
    }, 
    objects: [ 
     { 
      description: "A Room", 
      end: "2017-03-03T15:30:00", 
      id: 1234, 
      name: "Grad Day", 
      resource_uri: "/api/v1/endpoint/1234/", 
      room: "CMU Room", 
      start: "2017-03-03T09:00:00" 
     } 
    ]  
} 

JSON輸出的API端點不車型

[ 
    { 
     description: "A Room", 
     end: "2017-03-03T15:30:00", 
     id: 1234, 
     name: "Graduate Day", 
     resource_uri: "/api/v1/endpoint/1234/", 
     room: "CMU Room", 
     start: "2017-03-03T09:00:00" 
    } 
] 

回答

0

我把它通過修改Swapril馬哈詹的回答工作:

class EMSEventViewSet(viewsets.GenericViewSet, CustomPagination): 
    serializer_class = EMSEventSerializer(many=True) 
    http_method_names = ['get'] 


    def list(self, request): 
     results = [] 
     """ 
     Here is code that opens up a SQL connection, executes a 
     query, then transfers the data into results 
     """ 

     # Always sort results by start time 
     results = sorted(results, key=lambda k: k.start) 
     page = self.paginate_queryset(results) 
     serializer = EMSEventSerializer(instance=page, many=True) 

     return self.get_paginated_response(serializer.data) 

差異的原因1:

class EMSEventViewSet(viewsets.GenericViewSet, CustomPagination): 

我使用GenericViewSet而不是ViewSet。您必須使用ViewSet而不是ModelViewSet才能使用非ORM數據源,並且顯然需要GenericViewSet才能使用自定義分頁。此外,你必須通過你的自定義分頁。

差異的原因2:

serializer = EMSEventSerializer(instance=page, many=True) 

我在頁面傳遞到串行化,而不是結果。我實際上最終用instance = results來測試它,並得到了相同的結果,但傳入instance = page更有意義。

0

當你將覆蓋默認列表的方法,你必須自己分頁響應。在這種情況下,你list方法應該是這樣的

def list(self, request): 
    results = [] 
    """ 
    Here is code that opens up a SQL connection, executes a 
    query, then transfers the data into results 
    """ 

    # Always sort results by start time 
    results = sorted(results, key=lambda k: k.start) 

    # if paginate_queryset is not accessible in ViewSet then you can import it from paginator itself. 
    page = self.paginate_queryset(results) 

    serializer = EMSEventSerializer(instance=results, many=True) 
    return self.get_paginated_response(serializer.data)