如何使用nonorm mod进行自定义分页

2024-04-24 00:06:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是Django Rest framework3,我遇到了一些问题。我在this example之后实现了自定义分页,并且在this example之后还有一个非orm模型。但是,我无法在非orm模型上使用自定义分页(或任何分页)。在中,自定义分页设置为默认值设置.py它适用于我所有的带模型的视图集。在

带有模型的端点的JSON输出包含元信息并将对象嵌套在“objects:”中。没有模型的端点的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
        })

对象:

^{pr2}$

序列化程序:

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)

具有模型的API终结点的JSON输出:

{
    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"
        }
    ]    
}

没有模型的API端点的JSON输出

[
    {
        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"
    }
]

Tags: 对象模型selfjsondatagetobjects端点
2条回答

我修改了斯瓦普里尔·马哈扬的回答:

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:

^{pr2}$

我使用的是通用视图集,而不是视图集。您必须使用与ModelViewSet相对应的ViewSet来处理非ORM数据源,显然需要一个GenericViewSet来处理定制分页。此外,还必须传入自定义分页。在

大区别2:

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

我将页传递给序列化程序,而不是结果。实际上,我用instance=results测试了它,得到了相同的结果,但是传入instance=page更有意义。在

在重写默认列表方法时,必须自己对响应进行分页。在这种情况下,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)

相关问题 更多 >