我使用的是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"
}
]
我修改了斯瓦普里尔·马哈扬的回答:
大区别1:
^{pr2}$我使用的是通用视图集,而不是视图集。您必须使用与ModelViewSet相对应的ViewSet来处理非ORM数据源,显然需要一个GenericViewSet来处理定制分页。此外,还必须传入自定义分页。在
大区别2:
我将页传递给序列化程序,而不是结果。实际上,我用instance=results测试了它,得到了相同的结果,但是传入instance=page更有意义。在
在重写默认列表方法时,必须自己对响应进行分页。在这种情况下,
list
方法应该如下所示相关问题 更多 >
编程相关推荐