将GraphQLResponse字典转换成Python对象。

4

我正在使用aiographql-client运行一个graphql查询,并且得到一个GraphQLResponse对象,其中包含响应json数据的一个原始dict

这个字典符合一个模式,我可以使用graphql-core的build_schema方法将其解析为一个graphql.type.schema.GraphQLSchema类型。

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

任何帮助都将不胜感激!


我几年前也曾经遇到过这个问题,如果我没记错的话,唯一合理的方法就是手动将每个预期的字段名映射到对象的init或其他函数中相应的字典条目。根据您的用例和数据结构,从该字典转换为dataclass可能是一个不错的解决方案。 - LTJ
感谢您的反馈。我可能会把这个作为最后的手段 - 因为 GraphQLObjectType 已经有了类型,所以大部分工作似乎已经完成了,但是如果我没有弄错的话,在原始字典中有一些属性的名称与 ObjectType 不完全相同,因此如果不支持通用情况,那么做起来就有点棘手了。 - nettrino
我猜这些都是已知数据,所以你可以从头开始创建一个“通用”的映射和解析器 - 并没有那么多的数据类型。相比现成的库,这需要额外的工作,但如果你决定长期使用该技术,它应该会很有用。此外,根据你的项目用途,你可以直接使用GraphQLObjectType对象,而不必将它们转换为Python本地对象。 - LTJ
3个回答

1

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

如果您真的必须在运行时定义模型,则可以使用pydantic的create_model函数,在此处描述:https://pydantic-docs.helpmanual.io/usage/models/#dynamic-model-creation

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

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


提前生成是可以的。例如,可以从GitHub模式创建一个模型,该模式以GraphQ格式(在此处)和JSON格式(在此处)提供。例如,ActorLocation将是@dataclass class ActorLocation: city: str country: str ...如果有更复杂类型的类,则要进行迭代定义。我认为已经存在一个实用程序来执行此转换。 - nettrino
1
我猜你可以尝试使用https://github.com/qw-in/graphql-codegen-pydantic来实现。 - Jesse De Loore


0

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

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

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

试着看看它是否能帮助你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接