这是我参与更文挑战的第26天,活动详情查看: 更文挑战
前言
上一篇文章介绍了查询/查看/删除方法的封装
本文将继续对其它方法进行详尽的讲解
开始封装
在开始今天的封装前, 我们先说明先最常用的flask返回json结果:
from flask import jsonify
def api():
return jsonify(result)
利用flask提供的jsonify函数进行处理
分页查询
在实际的业务场景中, 我们经常会遇到的其实是分页查询
Flask-SQLAlchemy中有很成熟的分页查询: paginate
但此方法返回的结果无法直接转换为json格式, 所以需要进行一定程度的处理:
@classmethod
def page(cls, parameters: dict = None):
"""
分页查询
:param parameters: 条件
:return: 分页结果
"""
if parameters is None:
parameters = {}
pageable = parameters.get("pageable") or Pageable(1, 50)
result = cls.query.filter(**parameters).paginate(pageable.page, pageable.size, error_out=False).__dict__
del result['query']
return result
利用python内置的__dict__
方法将分页结果对象转换为字典
之后在删除非必要的query
属性, 之后再对内容进行返回和json转换即可
新增
刚刚说完如何转换为json, 现在面临的难题就是如何把json转换为对象
在经历了手写初始化方法/新增from_dict方法等等错误尝试后
笔者利用参数结构解决了这个问题, 即**
所以, 在遇到没有解决思路时, 千万要先冷静思考或咨询别人, 切莫自己胡乱研究, 会走太多弯路
上代码:
@classmethod
def add(cls, data: dict):
"""
新增
:return: 无
"""
result = cls(**data)
db.session.add(result)
db.session.commit()
return result
将前端传递的json格式数据(也就是字典)进行结构, 实现对象的构造
修改
和新增不同, 修改可能只会修改某些字段并非全部
所以, 我们要利用好hasattr
和setattr
:
@classmethod
def update(cls, id, data):
"""
更新
:return: 无
"""
old = cls.get(id)
if old is None:
raise BusinessException('资源不存在')
for key, value in data.items():
if hasattr(old, key):
setattr(old, key, value)
db.session.commit()
总结
CRUD的基础封装到这里就全部完成啦
但似乎还有些许不优雅的地方, 明天的最后一篇将会再进行升华哦