Python 樱桃糖&x2B;sqlalchemy+;sqlalchemy数据表:不可损坏类型:dict

Python 樱桃糖&x2B;sqlalchemy+;sqlalchemy数据表:不可损坏类型:dict,python,datatables,sqlalchemy,Python,Datatables,Sqlalchemy,我试图将jQuery datatables服务器端处理与cherrypy&sqlalchemy集成在一起,但遇到了一个关于“unhable type:'dict'”的错误 我编写的代码如下所示: @cherrypy.tools.json_out() def GET(self, *args, **kwargs): with GetDb().ScopedSession("Fetching detail for main page") as session: # definin

我试图将jQuery datatables服务器端处理与cherrypy&sqlalchemy集成在一起,但遇到了一个关于“unhable type:'dict'”的错误

我编写的代码如下所示:

@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
{'draw': '1', 'recordsTotal': '125', 'recordsFiltered': '125', 'error': "unhashable type: 'dict'"}
“params”打印的结果如下所示(略为截断):

结果输出如下所示:

@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
{'draw': '1', 'recordsTotal': '125', 'recordsFiltered': '125', 'error': "unhashable type: 'dict'"}
我怀疑DataTables()调用不喜欢类似于'jsonpath'的GET参数(请参阅上面的“#我认为这就是问题的原因”部分),因此我很好奇是否有办法让cherrypy将**kwargs作为嵌套键/值对返回,或者使用函数将kwargs转换为嵌套字典——或者,如果我完全错了,这完全是另一个错误。:)

谢谢

如果有帮助,请提供更多数据:

网页呈现显示一条警告,提示:

DataTables warning: table id=active-jobs - unhashable type: 'dict'
单击“确定”会在datatables代码中产生类型错误:

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
datatables.min.js:52未捕获类型错误:无法读取未定义的属性“length”
在vb上(datatables.min.js:52)
在datatables.min.js:49
at i(datatables.min.js:47)
在Object.success(datatables.min.js:48)
着火时(jquery-3.3.1.js:3268)
在Object.fireWith[as resolveWith](jquery-3.3.1.js:3398)
完成时(jquery-3.3.1.js:9305)
在XMLHttpRequest。(jquery-3.3.1.js:9548)
vb@datatables.min.js:52
(匿名)@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
完成@jquery-3.3.1.js:9305
(匿名)@jquery-3.3.1.js:9548
加载(异步)
发送@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
(匿名)@datatables.min.js:105
每个@jquery-3.3.1.js:354
每个@jquery-3.3.1.js:189
n@datatables.min.js:95
h、 fn.DataTable@datatables.min.js:177
可重建@(索引):128
(匿名)@(索引):266
mighthrow@jquery-3.3.1.js:3534
process@jquery-3.3.1.js:3602
设置超时(异步)
(匿名)@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
完成@jquery-3.3.1.js:3888

我终于明白了这一点。我的一个列是sqlalchemy_utils中的“JSONType”类型,并且sqlalchemy datatables类没有处理它为JSON数据返回的“dict”


不管是好是坏,我都解决了这个问题,在我的专栏中不包括这些内容,而是用一个手工制作的专栏,在一个对象中填写了我需要的详细信息。

请提供完整的回溯,如果有的话。没有回溯。这也不例外,“unhabable type:'dict'”来自rowTable.output_result()。经过进一步的思考,javascript会导致堆栈跟踪;因此,我将把它添加到描述中,以防有用。