我可以在Graphene Django的自定义类型下嵌套类似的模型关系吗?

问题描述

假设我有一个带有许多相关关系的Django模型,是否可以通过非模型类型将它们嵌套以进行查询一个具体的例子:

假设我有一个模型Organization,其关系包括X_projectsX_accounts等,它们也是Django模型。

很容易允许以下查询

query fetchOrganization($id: Int!) {
  organization(id: $id) {
    id,... other fields ...
    X_accounts {
      ...
    }
    X_projects {
      ...
    }
  }
}

但我希望支持以下查询

query fetchOrganization($id: Int!) {
  organization(id: $id) {
    id,... other fields ...
    X {
      accounts {
        ...
      }
      projects {
        ...
      }
    }
  }
}

考虑到X在后​​端成为Django模型/关系实际上没有任何意义,有没有办法实现这一目标?

解决方法

是的,您可以通过修改“ X”的新解析器来实现,该解析器使用具有帐户和项目字段的自定义对象类型。

例如,您需要创建一个新的复合对象类型,该对象是帐户和项目的容器(假设您已经为帐户和项目模型定义了DjangoObjectType类)>

class XType(graphene.ObjectType):
    account = graphene.Field(AccountType)
    project = graphene.Field(ProjectType)

然后修改组织类型定义以添加新字段,例如

class OrganizationType(DjangoObjectType):
   x = graphene.Field(XType)

   class Meta:
        model = Organization
        # You might want to exclude the x_project and x_account fields

   def resolve_x(self,info,**kwargs):
       # You'll have to work out how to parse arguments and fetch account and project
       return XType(account=account,project=project)