如何对序列化程序的查询集进行分页

Posted

技术标签:

【中文标题】如何对序列化程序的查询集进行分页【英文标题】:How to paginate queryset for Serializer 【发布时间】:2018-06-01 18:19:03 【问题描述】:

我正在检索Category 及其outfits 列表。我的问题是有太多outfits 属于category

class CategoryListAPIView(generics.RetrieveAPIView):
    serializer_class = CategoryDetailSerializer
    ...

class CategoryDetailSerializer(serializers.ModelSerializer):
    outfits = serializers.SerializerMethodField()
    ...

    class Meta:
        model = Category
        fields = (
            ...
            'outfits',
            ...
        )

    def get_outfits(self, obj):  //This is returning 39 items. 
        // Can we paginate this? 
        if obj.outfits is not None:
            return OutfitListSerializer(obj.outfits, many=True).data
        return None

我们能否对其进行分页,以便用户首先看到 24 个outfits 并刷新以查看outfits 的其余部分?

【问题讨论】:

我认为简单的解决方案是创建 api 方法来获取按类别过滤的分页 你是说...obj.outfits[offset : (offset+page_size)]? 【参考方案1】:

如果您想要简单的条件“前 24”和“其余”。您可以通过获取参数来控制它。

def get_outfits(self, obj):
    show_all = self.request.GET.get('show_all')

    if show_all:
        outfits = obj.outfits.all()
    else:
        outfits = obj.outfits.all()[:24]

    return OutfitListSerializer(outfits, many=True).data

现在您可以使用 GET /categories/ 获取前 24 套服装的类别,使用 GET /categories/?show_all=true 获取完整展示

【讨论】:

以上是关于如何对序列化程序的查询集进行分页的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中序列化模型实例?

Symfony2 分页:在超链接中序列化表单

如何对 DNA 序列(数据集)进行十进制编码?

如何使用 sklearn post-cross_val_predict 模型对另一个缩放数据集进行预测?以及模型是不是可以序列化?

没有模型 APIView 的 DRF 分页自定义响应

如何对 Azure 时间序列洞察查询 API 进行身份验证?