cherrypy + sqlalchemy + sqlalchemy-datatables: нечитаемый тип: dict - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь интегрировать обработку на стороне сервера jQuery datatables с cherrypy & sqlalchemy, и получаю сообщение об ошибке "unhashable type: 'dict" ".

Код, который я написал, выглядит следующим образомthis:

@cherrypy.tools.json_out()
def GET(self, *args, **kwargs):
    with GetDb().ScopedSession("Fetching detail for main page") as session:
        # defining columns
        columns = [
            ColumnDT(dbModels.DatabaseModel.Field1),
            ColumnDT(dbModels.DatabaseModel.Field2),
            # ...
        ]

        query = session.query(dbModels.DatabaseModel)

        # GET parameters
        params = kwargs  # I think this is what's causing the issue.

        print("==========================")
        print(params)
        print("==========================")

        # instantiating a DataTable for the query and table needed
        rowTable = DataTables(params, query, columns)

        # returns what is needed by DataTable
        result = rowTable.output_result()
        print("==========================")
        print(result)
        print("==========================")
        return result

Результат печати 'params' выглядит следующим образом (несколько усечено):

{'draw': '1', 'columns[0][data]': '', 'columns[0][name]': '', 'columns[0][searchable]': 'true' } 

И вывод результата выглядит так:

{'draw': '1', 'recordsTotal': '125', 'recordsFiltered': '125', 'error': "unhashable type: 'dict'"}

Я подозреваю, что вызову DataTables () не нравится параметр GET, похожий на jsonpath (см. Часть «# Я думаю, это является причиной проблемы» выше), поэтому мне интересно, есть литаким образом, я могу заставить cherrypy возвращать ** kwargs как вложенные пары ключ / значение, или функцию для преобразования kwargs во вложенный словарь - или, если я полностью ошибаюсь, и это совсем другая ошибка.:)

Спасибо!

Дополнительные данные, если это поможет:

При рендеринге веб-страницы отображается предупреждение:

DataTables warning: table id=active-jobs - unhashable type: 'dict'

Нажатие OK приводит к типуошибка в коде таблицы данных:

datatables.min.js:52 Uncaught TypeError: Cannot read property 'length' of undefined
    at vb (datatables.min.js:52)
    at datatables.min.js:49
    at i (datatables.min.js:47)
    at Object.success (datatables.min.js:48)
    at fire (jquery-3.3.1.js:3268)
    at Object.fireWith [as resolveWith] (jquery-3.3.1.js:3398)
    at done (jquery-3.3.1.js:9305)
    at XMLHttpRequest.<anonymous> (jquery-3.3.1.js:9548)
vb @ datatables.min.js:52
(anonymous) @ datatables.min.js:49
i @ datatables.min.js:47
success @ datatables.min.js:48
fire @ jquery-3.3.1.js:3268
fireWith @ jquery-3.3.1.js:3398
done @ jquery-3.3.1.js:9305
(anonymous) @ jquery-3.3.1.js:9548
load (async)
send @ jquery-3.3.1.js:9567
ajax @ jquery-3.3.1.js:9206
sa @ datatables.min.js:48
lb @ datatables.min.js:49
P @ datatables.min.js:41
T @ datatables.min.js:43
ha @ datatables.min.js:60
e @ datatables.min.js:105
(anonymous) @ datatables.min.js:105
each @ jquery-3.3.1.js:354
each @ jquery-3.3.1.js:189
n @ datatables.min.js:95
h.fn.DataTable @ datatables.min.js:177
RebuildTable @ (index):128
(anonymous) @ (index):266
mightThrow @ jquery-3.3.1.js:3534
process @ jquery-3.3.1.js:3602
setTimeout (async)
(anonymous) @ jquery-3.3.1.js:3640
fire @ jquery-3.3.1.js:3268
fireWith @ jquery-3.3.1.js:3398
fire @ jquery-3.3.1.js:3406
fire @ jquery-3.3.1.js:3268
fireWith @ jquery-3.3.1.js:3398
ready @ jquery-3.3.1.js:3878
completed @ jquery-3.3.1.js:3888

1 Ответ

0 голосов
/ 02 декабря 2018

Я наконец понял это. Один из моих столбцов был типа "JSONType" из sqlalchemy_utils, и класс sqlalchemy-datatables не обрабатывал то, что он возвращал 'dict' для данных JSON.

Я решил это - к лучшему или к худшему - не включив его в свои столбцы, а вместо этого создал вручную столбец, в котором я заполнил объект необходимыми деталями.

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