You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现GQLAlchemy模型对象到JSON的序列化?

将GQLAlchemy模型对象序列化为JSON的方法

下面是几种实用方案,适配不同场景需求:

1. 过滤模型内置属性直接序列化

GQLAlchemy的Node或Relationship实例的__dict__属性包含所有自定义字段,但会混有下划线开头的内部元数据(如_id、_labels),只需过滤掉这些内部属性即可:

import json
from gqlalchemy import Node, Field

# 定义GQLAlchemy模型
class User(Node):
    id: int = Field(unique=True, index=True)
    name: str
    email: str

# 创建模型实例
user = User(id=1, name="Alice", email="alice@example.com")

# 过滤内部属性并转为JSON
cleaned_data = {k: v for k, v in user.__dict__.items() if not k.startswith('_')}
json_result = json.dumps(cleaned_data)
print(json_result)

2. 自定义模型序列化方法

如果需要处理复杂类型(如日期、嵌套对象),可以在模型类中添加to_json方法,手动控制序列化逻辑:

import json
from gqlalchemy import Node, Field
from datetime import datetime

class Post(Node):
    id: int = Field(unique=True, index=True)
    title: str
    created_at: datetime

    def to_json(self):
        return json.dumps({
            "id": self.id,
            "title": self.title,
            "created_at": self.created_at.isoformat()  # 将日期转为ISO格式字符串
        })

# 使用示例
post = Post(id=101, title="Hello Memgraph", created_at=datetime.now())
print(post.to_json())

3. 结合Pydantic实现类型安全序列化

如果项目使用Pydantic,可以通过定义对应的Pydantic模型,自动处理类型校验和序列化,尤其适合复杂场景:

import json
from gqlalchemy import Node, Field
from pydantic import BaseModel

# GQLAlchemy模型
class User(Node):
    id: int = Field(unique=True, index=True)
    name: str
    email: str

# 对应Pydantic模型
class UserSchema(BaseModel):
    id: int
    name: str
    email: str

# 转换并序列化
user = User(id=2, name="Bob", email="bob@example.com")
user_schema = UserSchema(**{k: v for k, v in user.__dict__.items() if not k.startswith('_')})
json_result = user_schema.model_dump_json()
print(json_result)

注意事项

  • 若模型包含嵌套关系对象,需要递归处理每个关联实例的序列化
  • 遇到Memgraph特有类型(如空间几何类型),需手动转换为JSON可序列化格式(如WKT字符串)

内容的提问来源于stack exchange,提问作者GrandMel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:13:27