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

Posted

技术标签:

【中文标题】界面中包含的 Graphql 类型未添加到 graphene-django 中的模式【英文标题】:Graphql type included in interface not added to schema in graphene-django 【发布时间】:2020-01-16 11:41:31 【问题描述】:

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

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

你能发现上面的错误吗?

【问题讨论】:

【参考方案1】:

尝试将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.行长。

【讨论】:

很好!!!!经过数小时的谷歌搜索,我终于找到了包含石墨烯类型的正确方法!

以上是关于界面中包含的 Graphql 类型未添加到 graphene-django 中的模式的主要内容,如果未能解决你的问题,请参考以下文章

在 graphql 查询中包装组件时出错

请求在 Graphql 解析器中未定义,但在中间件中包含一些值。 (节点,快递)

如何在 sangria-graphql 中执行突变?

将“标签状态栏滚动到顶部”添加到 UIScrollView 中包含的 UITableView

除了标准库中包含的工具之外,Linux 上的 Python 还存在哪些分析工具?

在 Android 中查找路径中包含的点