在序列化器 django 中使用分页

2024-01-30

我正在开发一个 django 项目,在该项目中我试图获取所有具有update_ts场大于product_sync_ts from Product一次从服务器获取表,但由于产品数量很大,这需要大量时间来获取所有数据。我还将当前时间戳与数据一起返回。现在我想对结果进行分页。

我以前的代码:

Views.py

@api_view(['GET'])
def productlist(request, format=None):
    product_sync_ts = request.GET.get(
            'product_sync_ts', None)
    if product_sync_ts:
        product =Product.objects.filter(
            update_ts__gt=product_sync_ts)
        )
        serializer = SyncedProductSerializer(
            instance={'products': product})
        return response(serializer.data)
    else:
        content = {'details': "Bad Request"}
        raise APIException400(request, content)

序列化器.py

class SyncedProductSerializer(serializers.Serializer):
    product_sync_ts = serializers.SerializerMethodField(
        method_name='get_current_ts'
    )
    products = ProductSerializer(many=True, read_only=True)

    class Meta:
        fields = ('products', 'product_sync_ts')

    def get_current_ts(self, obj):
        product_sync_ts = datetime.utcnow().isoformat(' ')
        return product_sync_ts




class ProductSerializer(serializers.ModelSerializer):
    image_url = serializers.SerializerMethodField(
        method_name='change_image_url'
    )

    class Meta:
        model = Product
        fields = (
            'id',
            'name',
            'unit',
            'price',
            'image_url'
        )

    def change_image_url(self, obj):
        return ''.join([
            CDN_URL, str(obj.image_url)
        ]) if str(obj.image_url) else None

我如何尝试修改它以进行分页:

Views.py

class PaginatedProductList(APIView):

    def get(self, request, format=None):
        product_sync_ts = request.GET.get(
            'product_sync_ts', None)
        if product_sync_ts:
            product = GrProduct.objects.filter(
                update_ts__gt=product_sync_ts
            )
            paginator = Paginator(product, 1000)
            page = request.GET.get('page')
            try:
                 product = paginator.page(page)
            except PageNotAnInteger:
                 product = paginator.page(1)
            except EmptyPage:
                 product = paginator.page(paginator.num_pages)

             serializer = SyncedProductSerializer(
                 instance={'products': product})
            return Response(serializer.data)
        else:
            content = {'details': "Bad Request"}
            raise APIException400(request, content)

这工作正常,我得到分页结果,但问题是我无法将下一页和上一页信息发送给客户端。客户端无法知道有效(非空)页数是多少。

有人可以建议我如何修改我的代码才能做到这一点。


这是一个如何使用以下方法对结果进行分页的示例APIView类和PageNumberPagination分页类:

from rest_framework.views import APIView
from rest_framework.pagination import PageNumberPagination

class ProductList(APIView, PageNumberPagination):
    # number of items per page by default
    page_size = 1000
    # max number of items per page
    max_page_size = 1000

    def get_queryset(self):
        product_sync_ts = self.request.GET.get('product_sync_ts', None)
        if product_sync_ts:
            products = GrProduct.objects.filter(update_ts__gt=product_sync_ts)
            return self.paginate_queryset(products, self.request)

        raise APIException400(request, {'details': "Bad Request"})

    def get(self, request):
        products = self.get_queryset()
        serializer = SyncedProductSerializer(instance={'products': products})
        return self.get_paginated_response(serializer.data)

Read DRF - 页码分页 http://www.django-rest-framework.org/api-guide/pagination/#pagenumberpagination配置您的分页

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在序列化器 django 中使用分页 的相关文章

随机推荐

  • 邮箱/垃圾箱验证[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要为注
  • UWP DatePicker 月份的自定义字符串

    我正在为非英语用户做UWP应用程序 我需要使用 DatePicker 但我不喜欢月份名称用英文书写 我也不想用数字值显示月份 如何设置自己的字符串列表以将其显示在月份选择器上 据我所知 DatePicker不提供月份自定义字符串的机制 如果
  • QRect 的 qHash 函数

    计算的最佳方法是什么qHash的值QRect 我需要使用QRect 有可能QRectF 作为关键QCache 现在我正在使用这样的东西 inline uint qHash const QRect r return qHash QByteAr
  • $(document).ready(initialize) 和 $(document).on('ready',initialize) 有什么区别?

    有什么区别 document ready initialize and document on ready initialize 对我来说 它们似乎以同样的方式工作 document on ready initialize 如果执行文件时
  • 在jsp中使用另存为对话框下载文件...如何提示用户保存,查看取消对话框而不是直接打开图像

    我有一个jsp 其中我提供了一个用于下载任何文档的链接 每当用户单击链接时 都会直接打开文档 我想显示一个对话框 通常出现在许多网站上 它会要求用户保存 取消和查看文档 有人可以帮我吗 我在我的控制器类中使用以下代码 InputStream
  • 访问主程序子目录中的文件

    包含我的主要可执行文件的文件夹非常混乱 其中包含输入 输出和源文件 我想将其中一些文件移动到可执行文件的不同目录中 但仍然能够访问它们 例如 如果我可以制作一个目录 那就太好了 main outfile 它保存了我的程序的所有输出文件 在
  • OpenSSL ASN.1 编程教程

    我正在寻找有关使用 OpenSSL 库进行 ASN 1 DER 编码的任何 C C 教程 示例代码或文档 好吧 正如您在 openssl 网站上看到的那样 没有 ASN 1 函数的官方文档 但你总是可以下载 openssl 源 http o
  • Docker 不会在目录中搜索文件

    我创建了一个 docker 文件 FROM node 13 6 0 alpine3 10 WORKDIR src RUN apk add no cache bash COPY package json COPY package lock j
  • Marklogic Eclipse 设置

    我一直在尝试使用 marklogic 设置 eclipse 以将其用作我的 xquery 编辑器 我按照 Marklogic 关注此链接 http developer marklogic com learn xqdt setup http
  • Google Drive API Java 权限 500 内部错误

    我有下一个共享 Google Drive 文件的方法 public static boolean shareFile HttpServletRequest httpReq String fileId String user String r
  • setMultiChoiceItems 和 setMessage 在 AlertDialog 中不“工作”

    我很困惑为什么我的对话框无法正常工作 AlertDialog dialog final AlertDialog Builder builder new AlertDialog Builder this final CharSequence
  • 将“ngModelOptions”从自定义组件传递到包含的本机元素

    我有一个名为的自定义组件 Angular 6 ppo currency field使用以下模板 span class display formattedValue span
  • 带有文件扩展名的 ASP.NET MVC 路径

    在使用基于属性的路由的 ASP NET MVC5 中 我想处理带有文件扩展名的 URL 例如 javascript security js 下面是一个控制器操作方法示例 Route javascript security js public
  • 静态函数/变量

    我刚刚开始用 C 编程 这个静态变量 函数的概念对我来说并不清楚 为什么要使用它 还有其他替代方案吗 static 可能会有点令人困惑 因为它的含义根据使用位置的不同而略有不同 全局声明的静态变量仅在该源文件中可见 本地声明的静态变量将在对
  • 多个 Django 存储后端系统

    我有一个 django 应用程序 它使用 S3BotoStorage 后端在 Amazon s3 上存储上传的文件 但在 Web api 服务 使用 django tastypie 中 在 s3 上上传文件需要很长时间 因为有请求通过 We
  • C++ 中最短的程序

    我最近遇到了这段可以编译但运行时出现分段错误 g 的代码 这是来自 topcoder 的原始链接 include
  • PHP中如何获取一个句子的第一个单词?

    我想从字符串中提取变量的第一个单词 例如 采用以下输入 结果输出应该是Test 这是输入的第一个单词 我怎样才能做到这一点 有一个字符串函数 strtok http php net strtok 可用于将字符串拆分为更小的字符串 token
  • Javascript - 使用 forEach 向后循环数组

    有没有办法使用向后循环数组forEach 不是任何其他类型的循环 我知道如何使用 for 标准方式 并且没有实际反转数组本身 let arr 1 2 3 arr slice reverse forEach x gt console log
  • 如何避免 http://static.ak.facebook.com/connect/xd_arbiter.php 的链接无限期挂起[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我们在我们的网站上使用 Facebook 评论和 Facebook Like 按钮 这些以某种方式生成一个调用http
  • 在序列化器 django 中使用分页

    我正在开发一个 django 项目 在该项目中我试图获取所有具有update ts场大于product sync ts from Product一次从服务器获取表 但由于产品数量很大 这需要大量时间来获取所有数据 我还将当前时间戳与数据一起