【问题标题】:sqlalchemy-datatables TypeError: Object of type Customer is not JSON serializablesqlalchemy-datatables TypeError:Customer类型的对象不是JSON可序列化的
【发布时间】:2020-06-26 10:37:38
【问题描述】:

我正在尝试使用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 可序列化的

我按照文档做了所有事情,所以我不知道为什么这不起作用

【问题讨论】:

    标签: python json flask sqlalchemy


    【解决方案1】:

    问题是你试图在python对象&lt;Customer&gt;上调用jsonify()。要了解这是为什么,请查看您的输出:

    {
      '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
        }
    

    您还可以在 &lt;Customer&gt; 类上编写一个自动序列化所有重要属性的函数,然后您可以执行以下操作:

    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
            }
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2021-07-04
      • 2021-12-10
      • 1970-01-01
      • 2021-09-27
      • 2019-09-04
      • 2019-01-12
      相关资源
      最近更新 更多