sqlalchemy-datatables TypeError:客户类型的对象不可JSON序列化

时间:2020-03-14 20:18:27

标签: python json flask sqlalchemy

我正在尝试使用SQLAlchemy-DataTables来构建具有服务器端处理功能的表,

   @app.route("/data", methods=['GET'])
        def data():
        columns = [
            ColumnDT(Customer.id),
            ColumnDT(Customer.Email),
        ]
        query = db.session.query(Customer)
        params = request.args.to_dict()
    
        
        rowTable = DataTables(params, query, columns)
        print(query , file=sys.stdout)
        return jsonify(rowTable.output_result()) 

在调试模式下运行时,我可以看到rowTable.output_result()返回:

{'draw': '1', 'recordsTotal': '13997', 'recordsFiltered': '13997', 'data': [{'0': <Customer#1>, '1': 1}, {'0': <Customer#2>, '1': 2}, {'0': <Customer#3>, '1': 3}, {'0': <Customer#4>, '1': 4}, {'0': <Customer#5>, '1': 5}, {'0': <Customer#6>, '1': 6}, {'0': <Customer#7>, '1': 7}, {'0': <Customer#8>, '1': 8}, {'0': <Customer#9>, '1': 9}, {'0': <Customer#10>, '1': 10}]}

但是出现以下错误: TypeError:类型为Customer的对象不可JSON序列化

我按照文档进行了所有操作,所以我不知道为什么它不起作用

1 个答案:

答案 0 :(得分:2)

问题是您试图在python对象jsonify()上调用<Customer>。要了解为什么会这样,请查看您的输出:

{
  'draw': '1',
  'recordsTotal': '13997',
  'recordsFiltered': '13997',
  'data': [{
    '0': < Customer1 > ,
    '1': 1
  }, {
    '0': < Customer2 > ,
    '1': 2
  }, {
    '0': < Customer3 > ,
    '1': 3
  }, {
    '0': < Customer4 > ,
    '1': 4
  }, {
    '0': < Customer5 > ,
    '1': 5
  }, {
    '0': < Customer6 > ,
    '1': 6
  }, {
    '0': < Customer7 > ,
    '1': 7
  }, {
    '0': < Customer8 > ,
    '1': 8
  }, {
    '0': < Customer9 > ,
    '1': 9
  }, {
    '0': < Customer10 > ,
    '1': 10
  }]
}

'data'内部,您无法通过json.dumps()自动序列化对象,而jsonify()可以有效地为您执行这些操作。

要解决此问题,您需要修改输出,以使json.dumps()具有更多无聊的数据类型可以使用。例如:

for item in rowTable.output_result()['data']:
    item['0'] = {
        'customer_id': item['0'].id,
        # and so on for the other properties you're interested in
    }

您还可以在<Customer>类上编写一个函数,该函数会自动序列化所有重要属性,然后您可以执行以下操作:

for item in rowTable.output_result()['data']:
    item['0'] = item['0'].serialized

以及如何在课堂上做到这一点的示例:

class Customer(Model):
    id = Column(Integer)
    # etc...

    @property
    def serialized(self):
        return {
            'id': self.id
        }