对象不是Json可序列化的吗?

时间:2018-03-08 11:37:04

标签: python flask

我正在尝试查询模型。

例如名为“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()

我试图将记录作为回复发送,所以我面临这个错误。我是新来的烧瓶,请帮我解决。

1 个答案:

答案 0 :(得分:2)

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 datetime或其他未本机序列化为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]