我目前使用以下视图和序列化程序获得以下分页结果:
views.朋友
class DotaSearchViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
serializer_class = DotaSearchSerializer
permission_classes = (IsAuthenticated,)
authentication_classes = (SessionAuthentication, BasicAuthentication)
def get_queryset(self, *args, **kwargs):
request = self.request
results = EmptySearchQuerySet()
if request.GET.get('q') is not None:
query = request.GET.get('q')
sqs = SearchQuerySet().filter(content=query)
paginator = Paginator(sqs, 10)
page = request.QUERY_PARAMS.get('page')
try:
results = paginator.page(page)
except PageNotAnInteger:
results = paginator.page(1)
except InvalidPage:
results = paginator.page(paginator.num_pages)
return results
serialize认识.朋友
class DotaSearchSerializer(serializers.Serializer):
name = serializers.CharField()
quality = serializers.CharField()
type = serializers.CharField()
rarity = serializers.CharField()
hero = serializers.CharField()
image = serializers.CharField()
desc = serializers.CharField()
class PaginatedDotaSearchItemsSerializer(pagination.PaginationSerializer):
"""
Serializes page objects of results querysets.
"""
start_index = serializers.SerializerMethodField('get_start_index')
end_index = serializers.SerializerMethodField('get_end_index')
num_pages = serializers.Field(source='paginator.num_pages')
class Meta:
object_serializer_class = DotaSearchSerializer
def get_start_index(self, page):
return page.start_index()
def get_end_index(self, page):
return page.end_index()
def get_curr_page(self, page):
return page.number
现在我不确定我的分页序列化程序是否设置正确,但我如何让它在结果查询中序列化分页对象。
谢谢
好吧,我希望我更详细地阅读文档,我发现ListModelMixin带有一个分页属性以及一个定义自定义分页序列化程序的属性。
class DotaSearchViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
serializer_class = DotaSearchSerializer
permission_classes = (IsAuthenticated,)
authentication_classes = (SessionAuthentication, BasicAuthentication)
paginate_by = 10
pagination_serializer_class = PaginatedDotaSearchItemsSerializer
def get_queryset(self, *args, **kwargs):
request = self.request
sqs = EmptySearchQuerySet()
if request.GET.get('q') is not None:
query = request.GET.get('q')
sqs = SearchQuerySet().filter(content=query)
return sqs
class PaginatedDotaSearchItemsSerializer(pagination.PaginationSerializer):
"""
Serializes page objects of results querysets.
"""
start_index = serializers.SerializerMethodField('get_start_index')
end_index = serializers.SerializerMethodField('get_end_index')
num_pages = serializers.Field(source='paginator.num_pages')
current_page = serializers.SerializerMethodField('get_curr_page')
class Meta:
object_serializer_class = DotaSearchSerializer
def get_start_index(self, page):
return page.start_index()
def get_end_index(self, page):
return page.end_index()
def get_curr_page(self, page):
return page.number
如果你使用source='XXXXXX'
那么你应该这样做;
serializers.ReadOnlyField(source='paginator.num_pages')