在 Graphene python 解析器中调用自定义方法

Posted

技术标签:

【中文标题】在 Graphene python 解析器中调用自定义方法【英文标题】:Calling a custom method in a Graphene python resolver 【发布时间】:2021-10-26 00:38:18 【问题描述】:

您好,我只是想避免为每个查询重复代码,我想知道是否可以从解析器内部调用一个方法:

# pseudo code
class Query(graphene.ObjectType):

    field = graphene.Field(SomeType)

    def do_boring_task(parent, info, arg):
        
        return "I did something"

    def resolve_field(parent, info):

        did_something = parent.do_boring_task(arg) # <-- is this possible ?
        
        # do something here

        return resolved_fields

我总是收到“graphql.error.located_error.GraphQLLocatedError: 'NoneType' object has no attribute 'do_boring_task'”错误

是否可以按照我描述的方式来做,还是应该使用中间件来做?

谢谢

【问题讨论】:

【参考方案1】:

graphene.ObjectType 继承的类与普通类不同,resolve_fielddo_boring_task 默认为静态方法。

请注意resolve_field 的第一个参数是parent 而不是selfdo_boring_task 是 Query 类的类方法(其他语言中的静态方法)并且在父模式中不存在,这解释了您的错误。

您的问题的快速解决方法如下所示,在类之外定义函数。

def do_boring_task(args):
    return "I did something"

class Query(graphene.ObjectType):
    field = graphene.Field(SomeType)

    def resolve_field(parent, info):
        did_something = do_boring_task(arg)       
        # do something here
        return resolved_fields

更多详情请参阅博客中的这些内容

Implicit Static Method

Resolvers Outside the class

【讨论】:

以上是关于在 Graphene python 解析器中调用自定义方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在graphene-python DjangoObjectType中获取模型的当前实例

可以为 GraphQL 解析器转换返回类型吗

如何在石墨烯解析器后使用中间件?

如何允许石墨烯GraphQl中的任何字段过滤

自己写python爬虫框架

graphene-django 中的自定义参数