sqlalchemy-datatables TypeError: Объект типа Customer не JSON сериализуемый - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь использовать 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 serializable

Я сделал все согласно документации, поэтому не могу понять, почему это не работает

1 Ответ

1 голос
/ 14 марта 2020

Проблема в том, что вы пытаетесь вызвать jsonify() для python объекта <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
        }


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...