flask中将数据库模型类查询输出转变为字典格式

我们在开发flask项目的时候,估计遇到最多的就是json格式数据,这是因为,前端向后端发起请求,我们后端返回给前端的数据类型需要是json格式,json格式的数据类型Python中的字典格式,只有先把数据转化为字典格式,才能进一步将数据转换为json格式,那么我们每次在查询数据库数据的时候,不想每次都在后端将查询出来的单个数据再转换成字典格式,因为那样比较繁琐,所以我们选择在数据库模型类中去执行这个操作,具体的实现如下:

数据库模型类

class User(BaseModel, db.Model):
    """用户"""
    __tablename__ = "ih_user_profile"

    id = db.Column(db.Integer, primary_key=True)  # 用户编号
    name = db.Column(db.String(32), unique=True, nullable=False)  # 用户暱称
    password_hash = db.Column(db.String(128), nullable=False)  # 加密的密码
    mobile = db.Column(db.String(11), unique=True, nullable=False)  # 手机号
    real_name = db.Column(db.String(32))  # 真实姓名
    id_card = db.Column(db.String(20))  # 身份证号
    avatar_url = db.Column(db.String(128))  # 用户头像路径
    houses = db.relationship("House", backref="user")  # 用户发布的房屋
    orders = db.relationship("Order", backref="user")  # 用户下的订单

    @property
    def password(self):
        '''对应的password属性的读取操作'''
        raise AttributeError("不支持读取操作")

    @password.setter
    def password(self, value):
        '''对应的password 的属性的设置操作,value 为用户设置的密码值'''
        self.password_hash = generate_password_hash(value)

    def check_password(self, value):
        '''检查用户密码,value为用户输入的密码值'''
        return check_password_hash(self.password_hash, value)

    def to_dict(self):
        '''将对象转换为字典数据'''
        user_dict = {
            "user_id": self.id,
            "name": self.name,
            "mobile": self.mobile,
            "avatar": constants.QINIU_URL_DOMAIN + self.avatar_url if self.avatar_url else "",
            "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S")
        }
        return user_dict

    def auth_to_dict(self):
        '''将对象转换为字典数据'''
        auth_dict = {
            "user_id": self.id,
            "real_name": self.real_name,
            "id_card": self.id_card,
        }
        return auth_dict

后端处理逻辑

@api.route("/users/auth", methods=["GET"])
@login_required
def get_user_auth():
    '''获取用户实名认证的信息'''
    user_id = g.user_id

    # 在数据库中查询信息
    try:
        user = User.query.get(user_id)

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="获取用户实名信息失败")
    if user is None:
        return jsonify(errno=RET.NODATA, errmsg="实名信息不存在")

    return jsonify(errno=RET.OK, errmsg="OK", data=user.auth_to_dict())

前端处理逻辑

    //查询用户实名认证信息
    $.get("/api/v1_0/users/auth", function (resp) {
        //4101代表用户未登录
        if (resp.errno == 4101) {
            location.href = "/login.html"
        } else if (resp.errno == 0) {
            //如果返回的数据中real_name与id_card不为null,表示用户已经填写过实名信息
            if (resp.data.real_name && resp.data.id_card) {
                $("#real-name").val(resp.data.real_name);
                $("#id-card").val(resp.data.id_card);
                //给input 添加disabled属性 禁止用户修改
                $("#real-name").prop("disabled", true);
                $("#id-card").prop("disabled", true);
                //隐藏提交保存按钮
                $("#form-auth>input[type=submit]").hide();
            }
        }
    }, "json");

猜你喜欢

转载自blog.csdn.net/weixin_40612082/article/details/81125859