2017-12-27 21 views
0

私はPythonと私のアプリケーションでかなり新しく、Neomodelを使ってNeo4jデータベースからグラフデータを読み込んで取得しています。私は、以下の機能を持っている私のルートの1つでPython NeoModel JSONオブジェクトとしてクエリ結果を返す方法

@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) 

私の期待は私の/ユーザのルートはJSONオブジェクトを返すということですデータベース内のすべてのユーザーとNodeSetオブジェクトをJSONオブジェクトにシリアライズすることはできないので、リストに変換しようとしました。しかし、今、私は次のエラーを取得する実行すると: 「例外TypeError:タイプのオブジェクト 『ユーザー』は、シリアライズJSONではありません」

、ここで全体のスタックトレースです: トレースバック(最後の最新の呼び出し): ファイル」 "コール リターンself.wsgi_app(環境、start_responseを) ファイルで、ライン1997、" /Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py /ユーザ/ "mudbarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages /フラスコ/ app.py"、1985行目、wsgi_app レスポンス= self.handle_exception(e) ファイル "/Users/mdebarros/.virtualenvs/useractivitylogs /lib/python3.6/site-packages/flask/app.py "、行1540、handle_exception reraise(exc_type、exc_value、tb) ファイル「/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/_compat.py」、行33、reraiseで raise値 ファイル "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py"、1982行目、wsgi_app レスポンス= self.full_dispatch_request() ファイル "/ Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages /フラスコ/ 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行目、reraise raise値 ファイル "/Users/mdebarros/.virtualenvs/useractivitylogs /lib/python3.6/site-packages/flask/app.py "、line 1612、full_dispatch_request rv = self.dispatch_request() ファイル" /Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/ site-packages/flask/app.py "、1598行目、dispatch_request return self.view_functionsrule.endpoint ファイル「/Users/mdebarros/PycharmProjects/useractivitylogs/app/api/routes.py」、行16、get_users return json.dumps(dict(users = [list_of_users]のユーザーのユーザー)) ファイル "/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ json/init .py "、行231、ダンプ内 return _default_encoder.encode(obj) ファイル" /usr/local/Cellar/python3/3.6.2/Frameworks/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 return _iterencode(o、0) ファイル" /usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework /Versions/3.6/lib/python3.6/json/encoder.py "、行180、デフォルトで o。クラス) はTypeError:タイプのオブジェクトのユーザーが「私はこれを処理し、適切なJSONオブジェクトを返すことができる方法上の任意のヘルプや提案、シリアライズ

JSONではないでしょうか?

ありがとうございました。

--md

答えて

0

あなたが知っているように、それが必要であるユーザークラスモデルを解決するためのデータ構造(直列化)、の翻訳のプロセスを実行するための方法を持って、解決策は、メソッドを追加することであるということですその本のことを行います。

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])) 
+0

はあなたに@Codingをありがとう、それは完全に働きました。誰もがこれを必要とする場合に備えて、Node自体についての情報を探しているので、シリアライゼーションメソッドには唯一の変更がありました。私はuser_idプロパティを返しました。 – Cracoras

関連する問題