2017-03-03 47 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)