Python Flask-SQLAlchemy ORM 问题 ?

Python 的这个插件好难懂:

from sqlalchemy import Column, Integer, String
from lib.database import Base

class User(Base):
    __tablename__ = '表名'
    ID = Column(Integer, primary_key=True)
    app_key = Column(String(50), unique=True)
    secret = Column(String(120), unique=True)

    def __init__(self, app_key=None, secret=None):
        self.app_key = app_key
        self.secret = secret

    def __repr__(self):
        return f'<User {self.app_key!r}>'
>>> from model.user import User
>>> User.query.all()
[User(ID=3, app_key='TEST_1a2a0ad5579b7b45fc675181c7aeba8b', secret='TEST_c8593ffbfdbfc86445ff91430c5cb3aafc65'), User(ID=4, app_key='aaaaaa', secret='aaaaaa')]>>> 

为什么通过框架返回的时候就是:Unexpect System Error - Object of type User is not JSON serializable 有什么好的学习资料么,真的好难懂

阅读 2.1k
3 个回答

你可以在 User 类中写一个方法来处理:

class User(Base):
    # ...
    def to_dict(self):
        return {
            "ID": self.ID,
            "app_key": self.app_key,
            "secret": self.secret,
        }

然后用 to_dict 方法:

from flask import jsonify

@app.route("/users")
def get_users():
    users = User.query.all()
    return jsonify([user.to_dict() for user in users])

flask官方文档:https://flask.palletsprojects.com/en/2.1.x/
Flask-SQLAlchemy 官方文档:https://flask-sqlalchemy.palletsprojects.com/en/2.x/
你可以看看这些资料

你的 Base 是这样的吗?

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
    __tablename__ = '表名'
    ID = Column(Integer, primary_key=True)
    app_key = Column(String(50), unique=True)
    secret = Column(String(120), unique=True)

    def __init__(self, app_key=None, secret=None):
        self.app_key = app_key
        self.secret = secret

    def __repr__(self):

我就不贴代码了,直接说原因吧

  1. 因为你返回的得是可以被序列化的对象,字符串或者dict
  2. 此处你返回的是一个obj对象

解决方法

  1. 重写json方法
  2. 使用序列化库,flask也有配套的序列化第三方库
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题