Резольвер не получает аргументы при вложении - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть список классов, хранящихся в памяти, которые я пытаюсь проанализировать по различным типам.На него ссылаются через метод get_inventory().

Когда я вызываю классы по отдельности, они разрешаются так, как я ожидал.

Но когда я пытаюсь вложить один в другой, значениевозвращая ноль.

Код, за которым следуют несколько примеров:

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 на приведенный ниже, accountId всегда возвращает yo.

...
else:
    return Account(
        account_id='yo'
    )

Так что это говорит мне, что мой распознаватель запускается, но вызов в resolve_item не проходит account_id правильно.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Из того, что я вижу, похоже, что вместо того, чтобы быть переданным в качестве аргумента, account_id сохраняется как часть account в ObjectType.

Так что, если я добавлюниже я могу получить желаемый результат.

account_id = account_id if getattr(self, "account", None) is None else self.account.account_id

0 голосов
/ 26 ноября 2018

Это связано с тем, что аргументы в поле доступны только его непосредственным дочерним элементам.Если вам нужно получить аргумент во вложенных элементах, ваш распознаватель верхнего уровня должен вернуть аргумент как часть источника, а ваш вложенный элемент теперь может получить к нему аргументы из исходного объекта.

...