api 设计问题请教

2020-01-16 15:19:54 +08:00
 chaleaoch
有一个 api,有时候需要带分页,有时候不需要带分页.

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

有没有前辈遇到过类似问题.是如何解决的?谢谢.
2355 次点击
所在节点    程序员
14 条回复
qq316107934
2020-01-16 15:22:41 +08:00
不想分页的时候把 page_size 设置到 10000 不行么?
daqiaowijiu
2020-01-16 15:23:48 +08:00
前端分页能接受不。。。。。
renmu
2020-01-16 15:27:44 +08:00
if page is none:return query_all ()
chaleaoch
2020-01-16 15:28:57 +08:00
@qq316107934 行,真的有这么干的吗? 商业环境 无论是 2b 还是 2c.
MaPeiren
2020-01-16 15:54:16 +08:00
结合实际情况吧,不分页会不会有问题。
liuxu
2020-01-16 16:00:11 +08:00
千万不要开放 page_size,不然我调高就全库读取了
chaleaoch
2020-01-16 16:00:21 +08:00
@MaPeiren 不会啊 是给管理员用的, 数据量不大.而且我就是要全部数据啊.否则会有数据前端拿不到的情况.
chaleaoch
2020-01-16 16:01:01 +08:00
@liuxu 哈哈哈 没事, 是给内部人员用的.
MaPeiren
2020-01-16 16:03:45 +08:00
@chaleaoch 那就不用考虑那么多了,前端不想分页就 size 传大点完事儿了。
javapythongo
2020-01-16 16:11:46 +08:00
pageSize 传个-1 表示不分页嘛
wanguorui123
2020-01-16 16:25:08 +08:00
不做分页限制不怕把数据库搞垮吗
heysnakelis
2020-01-17 10:39:33 +08:00
传了 page_size 就分页,不传就不分页。
page_size = 0 就取默认值 /
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
2020-03-05 11:23:43 +08:00
刚才的漏了个地方,有点 bug

![3TowJP.png]( https://s2.ax1x.com/2020/03/05/3TowJP.png)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/638454

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX