AssertionError: тип Droid не соответствует связанному Droid типа графена

Я пытаюсь понять работу интерфейсов, используя пример звездных войн, приведенный в коде репозитория github. Выполнение простого запроса приводит к ошибке AssertionError

query = """query HeroNameQuery { hero { name } }"""

AssertionError: тип Droid не соответствует связанному Droid типа графена.

Потратив много времени на поиск решения этой проблемы, я не смог найти правильный ответ. Соответствующие файлы указаны по пути к репозиторию github:examples/starwars/data.py examples/starwars/schema.py

Пожалуйста помоги.

1 ответ

Решение

Нашел ответ, глубоко погрузившись в документацию Интерфейсы в графене и Ариадне. Требуется указать разрешение интерфейса в связанный тип данных. В примере "Звездных войн" персонаж должен был быть преобразован в человека или дроида. Это потребовало добавления метода класса следующим образом:

class Character(graphene.Interface):
id = graphene.ID()
name = graphene.String()
friends = graphene.List(lambda: Character)
appears_in = graphene.List(Episode)

@classmethod
def resolve_type(cls, instance, info):
    if isinstance(cls, Droid):
        return Droid
    else:
        return Human

def resolve_friends(self, info):
    # The character friends is a list of strings
    return [get_character(f) for f in self.friends]

Теперь код работает!

Другие вопросы по тегам