【问题标题】:Object is not Json serializable? [duplicate]对象不是 Json 可序列化的? [复制]
【发布时间】:2018-08-16 17:59:48
【问题描述】:

我正在尝试查询模型。

例如模型名称为“Demo”,我想获取该表的所有记录。

class Demo(db.Model):

   __tablename__ = "demo"

   field_1 = db.Column(db.String(255), nullable=False)
   field_2 = db.Column(db.String(255), nullable=False)

现在我正在查询

records = Messages.query.all()

我正在尝试将记录作为响应发送,所以我遇到了这个错误。我是flask新手,请帮我整理一下。

【问题讨论】:

    标签: python flask


    【解决方案1】:

    SQLAlchemy 返回一个 ResultProxy 对象,处理这个最简单/最简单的方法是动态序列化它。由于显而易见的原因,许多 python 数据类型不会原生序列化为 JSON。

    要让这个输出干净,试试这个:

    def serialize_message(msg):
        return {
            "field_str": msg.field_str,
            "field_int": int(msg.field_int),
            "field_dt": msg.field_dt.strftime("%Y%m%d"),
        }
    
    records = [serialize_message(z) for z in Messages.query]
    

    通过这种方式,您可以根据需要修改类型,例如 python 日期时间,或其他不原生序列化为 JSON 的特殊类型。

    更高级的方法是将序列化方法直接附加到模型定义中,例如:

    class Demo(db.Model):
        __tablename__ = "demo"
        field_str = db.Column(db.String(255), nullable=False)
        field_int = db.Column(db.Integer, nullable=False)
        field_dt = db.Column(db.DateTime, nullable=False)
    
        def to_json(self):
            return {
                "field_str": self.field_str,
                "field_int": int(self.field_int),
                "field_dt": self.field_dt.strftime("%Y%m%d"),
            }
    

    那你就可以直接用这个了:

    records = [z.to_json() for z in Messages.query]
    

    【讨论】:

    • 谢谢!简单实用。
    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 2014-04-12
    • 2013-05-23
    • 2015-02-24
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多