Python NeoModel如何将查询结果作为JSON对象返回

问题描述 投票:2回答:1

我对Python很新,在我的应用程序中,我使用Neomodel从Neo4j数据库加载和检索图形数据。

在我的一条路线中,我有以下功能:

@api_mod.route('/users')                                                            
def get_users():                                                                                                                                                        
     users = User.nodes #Returns a NodeSet                                                                                                                              
     list_of_users = list(users) #Converts the NodeSet object to a list                                                                                                                                                                                                                                                                    
     return json.dumps(dict(users = [user for user in list_of_users]))    

我的User类定义如下:

class User(StructuredNode):
    user_id = StringProperty(unique_index=True, required=True)
    logged_in = RelationshipTo('Environment', 'LOGGED_IN', model=LoginAction)
    launched = RelationshipTo('Application', 'LAUNCHED', model=LaunchedAction)
    entered = RelationshipTo('Application', 'ENTERED', model=EnteredAction)
    accessed = RelationshipTo('Application', 'ACCESSED', model=AccessedAction)
    exited = RelationshipTo('Application', 'EXITED', model=ExitedAction)
    logged_out = RelationshipTo('Environment', 'LOGGED_OUT', model=LogoutAction)
    timed_out = RelationshipTo('Environment', 'TIME_OUT', model=TimeoutAction)

    def toJSON(self):
        return dict(user_id = self.user_id)

我的期望是我的/ users路由将返回一个包含数据库中所有用户的JSON对象。我理解NodeSet对象不能序列化为JSON对象,因此我尝试将其转换为列表。但是现在当我运行时出现以下错误:“TypeError:'User'类型的对象不是JSON可序列化的”

这里是整个堆栈跟踪:Traceback(最近一次调用最后一次):文件“/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py”,1997年,在电话中返回self.wsgi_app(environ,start_response)文件“/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py”,第1985行,在wsgi_app response = self.handle_exception(e )文件“/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py”,第1540行,在handle_exception中重新加载(exc_type,exc_value,tb)文件“/ Users / mdebarros / .virtualenvs / useractivitylogs / lib / python3.6 / site-packages / flask / _compat.py“,第33行,重新加注值文件”/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages /flask/app.py“,第1982行,在wsgi_app response = self.full_dispatch_request()文件”/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py“,行1614,在full_dispatch_request中rv = self.handle_user_exception (e)文件“/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py”,第1517行,在handle_user_exception中重新加载(exc_type,exc_value,tb)文件“/ Users / mdebarros / .virtualenvs / useractivitylogs / lib / python3.6 / site-packages / flask / _compat.py“,第33行,重新加注值文件”/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site -packages / flask / app.py“,第1612行,在full_dispatch_request中rv = self.dispatch_request()文件”/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py“ ,第1598行,在dispatch_request中返回self.view_functionsrule.endpoint文件“/Users/mdebarros/PycharmProjects/useractivitylogs/app/api/routes.py”,第16行,在get_users中返回json.dumps(dict(users = [user for user]在list_of_users]))文件“/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/init.py”,第231行,在转储中返回_default_encoder .encode(obj)文件“/usr/local/Cellar/python3/3.6.2/Framew orks / Python.framework / Versions / 3.6 / lib / python3.6 / json / encoder.py“,第199行,编码块= self.iterencode(o,_ one_shot = True)文件”/ usr / local / Cellar / python3 /3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py“,第257行,在iterencode中返回_iterencode(o,0)文件”/ usr / local / Cellar / python3 /3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py“,第180行,默认为o.class.name)TypeError:”User“类型的对象不是JSON序列化

有关如何处理此问题并返回正确的JSON对象的任何帮助或建议?

提前感谢您的任何帮助。

--md

python flask neo4j flask-restful neomodel
1个回答
1
投票

如你所知,有必要的是用户类Model有一个方法来执行数据结构的转换过程(序列化),要解决,一个解决方案就是添加一个方法来做到这一点:

class User(StructuredNode):
    user_id = StringProperty(unique_index=True, required=True)
    logged_in = RelationshipTo('Environment', 'LOGGED_IN', model=LoginAction)
    launched = RelationshipTo('Application', 'LAUNCHED', model=LaunchedAction)
    entered = RelationshipTo('Application', 'ENTERED', model=EnteredAction)
    accessed = RelationshipTo('Application', 'ACCESSED', model=AccessedAction)
    exited = RelationshipTo('Application', 'EXITED', model=ExitedAction)
    logged_out = RelationshipTo('Environment', 'LOGGED_OUT', model=LogoutAction)
    timed_out = RelationshipTo('Environment', 'TIME_OUT', model=TimeoutAction)

@property
def serialize(self):
    return {
        'user_id': self.user_id,
        'logged_in': self.logged_in,
        'launched': self.launched,
        'entered': self.entered,
        'accessed': self.accessed,
        'exited': self.exited,
        'logged_out': self.logged_out,
        'timed_out'  : self.timed_out
   }

现在,随着方法的添加,属性可以被称为属性:

@api_mod.route('/users')                                                            
def get_users():                                                                                                                                                        
    users = User.nodes                                                                                                                            
    list_of_users = list(users)
    return json.dumps(dict(json_users = [user.serialize for user in list_of_users]))
© www.soinside.com 2019 - 2024. All rights reserved.