How to serialize SqlAlchemy result to JSON?

后端 未结 27 1880
说谎
说谎 2020-11-22 09:59

Django has some good automatic serialization of ORM models returned from DB to JSON format.

How to serialize SQLAlchemy query result to JSON format?

I tried

27条回答
  •  旧时难觅i
    2020-11-22 10:19

    Python 3.7+ and Flask 1.1+ can use the built-in dataclasses package

    from dataclasses import dataclass
    from datetime import datetime
    from flask import Flask, jsonify
    from flask_sqlalchemy import SQLAlchemy
    
    
    app = Flask(__name__)
    db = SQLAlchemy(app)
    
    
    @dataclass
    class User(db.Model):
      id: int
      email: str
    
      id = db.Column(db.Integer, primary_key=True, auto_increment=True)
      email = db.Column(db.String(200), unique=True)
    
    
    @app.route('/users/')
    def users():
      users = User.query.all()
      return jsonify(users)  
    
    
    if __name__ == "__main__":
      users = User(email="user1@gmail.com"), User(email="user2@gmail.com")
      db.create_all()
      db.session.add_all(users)
      db.session.commit()
      app.run()
    

    The /users/ route will now return a list of users.

    [
      {"email": "user1@gmail.com", "id": 1},
      {"email": "user2@gmail.com", "id": 2}
    ]
    

    Auto-serialize related models

    @dataclass
    class Account(db.Model):
      id: int
      users: User
    
      id = db.Column(db.Integer)
      users = db.relationship(User)  # User model would need a db.ForeignKey field
    

    The response from jsonify(account) would be this.

    {  
       "id":1,
       "users":[  
          {  
             "email":"user1@gmail.com",
             "id":1
          },
          {  
             "email":"user2@gmail.com",
             "id":2
          }
       ]
    }
    

    Overwrite the default JSON Encoder

    from flask.json import JSONEncoder
    
    
    class CustomJSONEncoder(JSONEncoder):
      "Add support for serializing timedeltas"
    
      def default(o):
        if type(o) == datetime.timedelta:
          return str(o)
        elif type(o) == datetime.datetime:
          return o.isoformat()
        else:
          return super().default(o)
    
    app.json_encoder = CustomJSONEncoder      
    

提交回复
热议问题