【问题标题】:Convert GraphQLResponse dictionary to python object将 GraphQLResponse 字典转换为 python 对象
【发布时间】:2022-10-02 22:02:27
【问题描述】:

我正在使用aiographql-client 运行graphql 查询并返回一个GraphQLResponse 对象,该对象包含一个原始dict 作为响应json 数据的一部分。

该字典符合一个模式,我可以使用graphql-core\'s build_schema method 将其解析为graphql.type.schema.GraphQLSchema 类型。

我也可以正确获取正在返回的对象的GraphQLObjectType,但是我不确定如何使用GraphQLObjectType 作为参考,将字典正确反序列化为具有所有适当字段的python 对象。

任何帮助将不胜感激!

  • 几年前我也为此苦苦挣扎,如果我没记错的话,唯一明智地做到这一点的方法是将每个预期的字段名称手动映射到对象的 init 或其他函数中的相应字典条目。根据您的用例和数据结构,从所述 dict 转换为 dataclass 可能是一个很好的解决方案。
  • 感谢您的反馈。我可能会在不得已的情况下这样做 - 感觉虽然大部分工作已经存在,因为GraphQLObjectType 确实有类型,但是如果我没记错的话,原始字典中有一些属性不是名称与 ObjectType 的名称相同,因此如果本机不支持它,则在通用情况下执行此操作会有点棘手
  • 好吧,我猜这是所有已知数据,因此您可以从头开始创建“通用”映射和解析器 - 没有那么多数据类型。与开箱即用的库相比,这是一些额外的工作,但如果您决定更长时间地坚持使用该技术,它应该会很有用。此外,根据您的项目的用途,您可以只使用 GraphQLObjectType 对象运行,而不是将它们转换为 python 本机对象。

标签: python graphql deserialization


【解决方案1】:

我建议在解析中使用 Pydantic 来完成繁重的工作。 然后,您可以预先生成模型并根据GraphQLObjectType 选择您需要的模型,或者根据build_schema 返回的定义在运行时生成它们。

如果你真的必须在运行时定义你的模型,你可以使用这里描述的 pydantic 的create_model 函数来做到这一点:https://pydantic-docs.helpmanual.io/usage/models/#dynamic-model-creation

对于静态模型生成,您可能可以利用 https://jsontopydantic.com/ 之类的东西

如果您分享一些代码示例,我很乐意就实际实现提供更多见解

【讨论】:

【解决方案2】:

在开发个人项目时,我遇到了同样乏味的问题。 因此,我刚刚发布了一个库,其目的是管理 python 对象和 graphql 对象之间的映射(python 对象 -> graphql 查询和 graphql 响应 -> python 对象)。

https://github.com/dapalex/py-graphql-mapper

到目前为止,它只管理基本的查询和响应,如果它变得有用,我将继续实现更多功能。

尝试看看它是否可以帮助你

【讨论】:

    猜你喜欢
    • 2011-11-26
    • 2019-07-21
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2018-07-15
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多