V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chaleaoch
V2EX  ›  程序员

api 设计问题请教

  •  
  •   chaleaoch · 2020-01-16 15:19:54 +08:00 · 2351 次点击
    这是一个创建于 1772 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个 api,有时候需要带分页,有时候不需要带分页.

    drf 的默认规则是, 带 page 和 page_size 就是分页.
    如果不带参数, page_size 默认是 10
    如果想不分页, 可以将 pagination_class= None
    但是这样的话 我还想分页呢...
    这个 api 应该如何设计.
    是不是只能 设计成两个 api 或者 通过参数区分.
    ?is_pagination=True/False

    有没有前辈遇到过类似问题.是如何解决的?谢谢.
    14 条回复    2020-03-05 11:23:43 +08:00
    qq316107934
        1
    qq316107934  
       2020-01-16 15:22:41 +08:00
    不想分页的时候把 page_size 设置到 10000 不行么?
    daqiaowijiu
        2
    daqiaowijiu  
       2020-01-16 15:23:48 +08:00
    前端分页能接受不。。。。。
    renmu
        3
    renmu  
       2020-01-16 15:27:44 +08:00 via Android
    if page is none:return query_all ()
    chaleaoch
        4
    chaleaoch  
    OP
       2020-01-16 15:28:57 +08:00
    @qq316107934 行,真的有这么干的吗? 商业环境 无论是 2b 还是 2c.
    MaPeiren
        5
    MaPeiren  
       2020-01-16 15:54:16 +08:00
    结合实际情况吧,不分页会不会有问题。
    liuxu
        6
    liuxu  
       2020-01-16 16:00:11 +08:00
    千万不要开放 page_size,不然我调高就全库读取了
    chaleaoch
        7
    chaleaoch  
    OP
       2020-01-16 16:00:21 +08:00
    @MaPeiren 不会啊 是给管理员用的, 数据量不大.而且我就是要全部数据啊.否则会有数据前端拿不到的情况.
    chaleaoch
        8
    chaleaoch  
    OP
       2020-01-16 16:01:01 +08:00
    @liuxu 哈哈哈 没事, 是给内部人员用的.
    MaPeiren
        9
    MaPeiren  
       2020-01-16 16:03:45 +08:00
    @chaleaoch 那就不用考虑那么多了,前端不想分页就 size 传大点完事儿了。
    javapythongo
        10
    javapythongo  
       2020-01-16 16:11:46 +08:00
    pageSize 传个-1 表示不分页嘛
    wanguorui123
        11
    wanguorui123  
       2020-01-16 16:25:08 +08:00
    不做分页限制不怕把数据库搞垮吗
    heysnakelis
        12
    heysnakelis  
       2020-01-17 10:39:33 +08:00
    传了 page_size 就分页,不传就不分页。
    page_size = 0 就取默认值 /
    Akkuman
        13
    Akkuman  
       2020-03-05 11:08:47 +08:00
    今天刚写了一个,看下继承的基类的逻辑即可完成,我也是找了一圈没找到,就自己看了下写了个,也算是给同样搜索的有个留存

    ```
    class PageAndSizePagination(PageNumberPagination):
    """
    基于 page 和每页 size 进行简单的分页. For example:

    http://api.example.org/accounts/?page=4
    http://api.example.org/accounts/?page=4&size=100
    """
    page_size_query_param = 'size'

    def get_page_size(self, request):
    """
    重写 get_page_size 方法以支持全部更多模式下的分页. For Example:

    返回全部
    http://api.example.org/accounts/
    http://api.example.org/accounts/?page=x
    http://api.example.org/accounts/?page=x&size=-1 (size 为负数)
    其他的与普通的一样
    """
    if self.page_size_query_param:
    try:
    page_size_query_param = request.query_params[self.page_size_query_param]
    if int(page_size_query_param) < 0:
    return None
    except (KeyError, ):
    return None

    return self.page_size
    ```
    Akkuman
        14
    Akkuman  
       2020-03-05 11:23:43 +08:00
    刚才的漏了个地方,有点 bug

    ![3TowJP.png]( https://s2.ax1x.com/2020/03/05/3TowJP.png)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2912 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:27 · PVG 11:27 · LAX 19:27 · JFK 22:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.