我有一个试图存储通过各种类型解析的内存中的类的列表。通过方法get_inventory()
进行引用。
当我分别调用这些类时,它们会按我期望的方式解析。
但是当我尝试将另一个嵌套时,该值返回null。
代码,后跟一些示例:
class Account(graphene.ObjectType):
account_name = graphene.String()
account_id = graphene.String()
def resolve_account(
self, info,
account_id=None,
account_name=None
):
inventory = get_inventory()
result = [Account(
account_id=i.account_id,
account_name=i.account_name
) for i in inventory if (
(i.account_id == account_id) or
(i.account_name == account_name)
)]
if len(result):
return result[0]
else:
return Account()
account = graphene.Field(
Account,
resolver=Account.resolve_account,
account_name=graphene.String(default_value=None),
account_id=graphene.String(default_value=None)
)
class Item(graphene.ObjectType):
item_name = graphene.String()
region = graphene.String()
account = account
def resolve_item(
self, info,
item_name=None
):
inventory = get_inventory()
result = [Item(
item_name=i.item_name,
region=i.region,
account=Account(
account_id=i.account_id
)
) for i in inventory if (
(i.item_name == item_name)
)]
if len(result):
return result[0]
else:
return Item()
item = graphene.Field(
Item,
resolver=Item.resolve_item,
item_name=graphene.String(default_value=None)
)
class Query(graphene.ObjectType):
account = account
item = item
schema = graphene.Schema(query=Query)
假设我有一个帐户foo
,其中有一个项目bar
。以下查询可正确返回字段。
{
account(accountName:"foo") {
accountName
accountId
}
}
{
item(itemName: "bar") {
itemName
region
}
}
因此,如果我想找到包含项目bar
的帐户,我想我可以查询bar
并获得foo
。但是它将account
字段返回为null
。
{
item(itemName: "bar") {
itemName
region
account {
accountId
accountName
}
}
}
回想一下,作为resolve_item
的一部分,我正在做account=Account(account_id=i.account_id)
-我希望它能起作用。
如果我将resolve_account
的最后一个return语句更改为以下内容,则accountId
总是返回yo
。
...
else:
return Account(
account_id='yo'
)
这告诉我我的解析器正在触发,但是resolve_item
中的调用未正确传递account_id
。
我在做什么错了?
答案 0 :(得分:0)
这是因为字段上的参数仅可用于其直接子级。如果需要检索嵌套元素中的参数,则顶级解析程序需要将参数作为源的一部分返回,并且嵌套元素现在可以从源对象访问它的参数。
答案 1 :(得分:0)
据我所见,account_id
似乎已经作为account
的一部分存储在ObjectType
中,而不是作为参数传递了。
因此,如果我添加以下内容,就可以得到想要的结果。
account_id = account_id if getattr(self, "account", None) is None else self.account.account_id