在使用FastApi框架开发时,如果需要使用BaseModel数据模型定义一个分页数据,需要用户传入的参数是page,page_size。但我们在处理时是需要将其转化成sql中的start,为了避免每次都需要自己去再进行计算,可以使用property来将一些方法设置成属性。如下在data_list方法中就可以直接使用pageinfo.start来取得所要的值。本文地址:http://www.04007.cn/article/1212.html,未经许可,不得转载.
# 分页的数据模型 class PageInfo(BaseModel): page: int = Body(1, ge=1) page_size: int = Body(10, ge=5, le=100) @property def start(self): return self.page_size * (self.page - 1) # 方法 async def data_list( pageinfo: PageInfo, ) pass这样的pageinfo确实进行了一些改变,但是在将pageinfo往其它模块进行传参前,如果我想给pageinfo新设置一个属性,比如增加当前登录的用户id筛选(不要和我说有其它的方法啊,我就想统一使用pageinfo一个参数把涉及分页的参数转给后端分页服务)。
pageinfo.user_id = session_user.user_id
# 这时会报以下错误
ValueError: "PageInfo2" object has no field "user_id"本文地址:http://www.04007.cn/article/1212.html,未经许可,不得转载.
这时的pageinfo实现不了让我随意添加我要的参数,目前的pageinfo是一个class, 我看了一下BaseModel类,也没有找到相关的如add_pro..方法可以调用,因此没有在框架原生的方法中找到实现我这个目的的方法。后来我自己使用了将pageinfo先转抱为dict,然后再转换成object。即调用一个自己实现的这样的方法:dict2obj(cla.__dict__)。这样可以满足我的想法,但有一个缺点就是会丢失上面定义的property属性。
如果这个BaseModel的参数能有一个属性hidden,实现这个参数我们虽然设置了,但是可以不在前端request_body中展示,而是我们用来在后台进行数据处理,就能完美地解决这个问题。本文地址:http://www.04007.cn/article/1212.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/1212.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |