0

根据Ariadne 的文档,应该可以使用set_alias. 但我不能让它工作,set_alias没有抱怨,但任何对别名字段的查询都返回 null。

# test.py 
from ariadne import ObjectType, gql, make_executable_schema
from ariadne.asgi import GraphQL
from types import SimpleNamespace

type_defs = gql("""
    type Query {
        hello: String!
        goodbye: String!
    }
""")

query = ObjectType("Query")

@query.field("hello")
def resolve_hello(_, info):
    request = info.context['request']
    user_agent = request.headers.get('user-agent', 'guest')
    return 'hello, %s' % user_agent

query.set_alias('goodbye', 'hello')

schema = make_executable_schema(type_defs, query )

app = GraphQL(schema, debug=True)

我和它一起跑uvicorn test:app

那么定义别名的正确方法是什么?

4

1 回答 1

0

那不是set_alias做什么。set_alias只能对已解析对象中的现有属性(而不是解析器)进行别名。因此,假设您有一个user解析为具有属性的对象的字段first_namelast_name您可以定义一个first映射到first_name. 因此,本质上set_alias为您提供了一种方便的语法来定义映射到对象属性的解析器:

from ariadne import QueryType, ObjectType, gql, make_executable_schema
from ariadne.asgi import GraphQL
from types import SimpleNamespace

type_defs = gql("""
    type Query {
        user: User
    }

    type User {
        username: String!
        first: String
        last: String
    }
""")

query = QueryType()


@query.field("user")
def resolve_user(obj, info):
    to_return = SimpleNamespace()
    to_return.first_name = 'Rubén'
    to_return.last_name = 'Laguna'
    return to_return

user = ObjectType("User")

@user.field("username")
def resolve_username(obj, info):
    return f"{obj.first_name} {obj.last_name}"


user.set_alias('last', 'last_name')
user.set_alias('first', 'first_name')

schema = make_executable_schema(type_defs, query, user)

app = GraphQL(schema, debug=True)

查询{user { first}} 将返回{"data": {"user": {"first": "Rubén"}}},而无需为first.

于 2021-01-04T19:02:34.427 回答