Flask-SQLAlchemy简单封装(二)

1,401 阅读2分钟

这是我参与更文挑战的第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格式数据(也就是字典)进行结构, 实现对象的构造

修改

和新增不同, 修改可能只会修改某些字段并非全部

所以, 我们要利用好hasattrsetattr:

@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的基础封装到这里就全部完成啦

但似乎还有些许不优雅的地方, 明天的最后一篇将会再进行升华哦