接口中包含的 Graphql 类型未添加到 graphene-django 中的模式

Graphql type included in interface not added to schema in graphene-django

我有一个由两个具体类型实现的接口类型

interface InterfaceType {
  id: ID!
  name: String!
}

 type Type1 implements InterfaceType {
    aField: String
}

 type Type2 implements InterfaceType {
    anotherField: String
}

使用石墨烯-django:

class InterfaceType(graphene.Interface):
    id = graphene.ID(required=True)
    name = graphene.String(required=True)

class Type1(graphene_django.types.DjangoObjectType):
    a_field = graphene.String(required=False)

    class Meta:
        model = Model1
        interfaces = (InterfaceType,)

class Type2(graphene_django.types.DjangoObjectType):
    another_field = graphene.String(required=False)

    class Meta:
        model = Model2
        interfaces = (InterfaceType,)

只要某些查询或突变直接使用 Type1Type2,这就有效。但就我而言,它们仅通过 InterfaceType.

间接使用

问题是当我尝试通过内联片段请求 aFieldanotherField 时:

query {
    interfaceQuery {
        id
        name
        ...on Type1 {
            aField
        }
        ...on Type2 {
            anotherField
        }
    }

使用 react-apollo:

import gql from 'graphql-tag';

const interfaceQuery = gql`
    query {
        interfaceQuery {
            id
            name
            ... on Type1 {
                aField
            }
            ... on Type2 {
                anotherField
            }
        }
    }
`;

我收到错误 "Unknown type "Type1". Perhaps you meant ..."

好像类型没有添加到架构中,因为它们没有直接使用 - 但我仍然需要它们来查询 aFieldanotherField.

你能找出上面的错误吗?

尝试将 Type1Type2 显式添加到您的架构中。 Graphene 需要您的一点指导才能知道您想将这些类型添加到您的架构中。

schema = graphene.Schema(
    query=Query,
    mutation=Mutation,
    types=[
        Type1,
        Type2,
    ]
)

这也是 mentioned in the documentation(虽然我觉得有点容易忽略)。当您查看示例代码时,有这样一行:

schema = graphene.Schema(query=Query, types=[Human, Droid])

因此(顺便说一句)这可能是一个很好的例子,说明为什么最好不要将某些内容折叠成一行,即使您可以 w.r.t。线长。