如何使用动态别名在单个请求中多次调用 GraphQL 突变
Posted
技术标签:
【中文标题】如何使用动态别名在单个请求中多次调用 GraphQL 突变【英文标题】:How to call a GraphQL mutation multiple times within a single request, using dynamic aliases 【发布时间】:2021-09-25 08:46:45 【问题描述】:我在前端使用 react + graphql 和 apollo 客户端,后端使用 graphene + python
我要更新或添加新课程,如下所述:
import gql from "@apollo/client";
const ADD_OR_UPDATE_COURSE = gql`
mutation AddCourse($id: ID, $description: String, $name: String!, $orgId: ID!)
addCourse(id: $id,description: $description, name: $name, orgId: $orgId)
course
id
name
description
`;
export default ADD_OR_UPDATE_COURSE;
这对于添加单个课程很好,但我希望能够添加多个课程而不必多次向后端发送新请求。
Daniel 在this post 的答案和marktani 在this other post 的答案几乎给了我我需要的东西,除了我希望这是动态的,而事先不知道会有多少插入。
他们的帖子已经有一段时间了,所以我想知道今天是否有一个简单的解决方案,或者我应该提前修改我的后端以接受列表而不是单一课程的突变?
【问题讨论】:
... 更新 API ... 一些updateCourses
大量添加/删除/更新?
【参考方案1】:
您需要更新后端以适应列表输入,因为 graphql 是强类型的。所以,要么你做多个别名突变,要么让你的输入接受课程列表。无论哪种方式,您都必须遵循架构中定义的内容。
你可以试试这样的:
class CourseInput(InputObjectType):
name = graphene.String()
orgId = graphene.Int()
description = graphene.String()
class CreateCourses(graphene.Mutation):
class Input:
courses = graphene.List(CourseInput)
courses = graphene.List(lambda: Course)
def mutate(self, root, info, **kwargs):
errors = []
for course in kwargs.get('courses'):
try:
Course.objects.create(**course)
except:
errors.append(f'can't create $course.name')
return CreateCourses(courses=courses, errors=errors)
顺便说一句,您的应用程序不应该为课程生成 id 而不是人们将其放入吗?
【讨论】:
嘿感谢您的评论。最后,这正是我所做的。是的,ID 是自动生成的。在我提供的代码的情况下,这是因为在单个课程的实现中,我将更新和添加操作都包装在同一个突变中,所以如果用户提供了一个 id,它就是一个更新,否则如果 id 是“ " 这是一个插入 :)以上是关于如何使用动态别名在单个请求中多次调用 GraphQL 突变的主要内容,如果未能解决你的问题,请参考以下文章
如何在单个 API 调用中多次使用相同的 GraphQL 查询。放大,DynamoDB
在单个单元格 google colab 中多次调用 matplotlib imshow() 时如何保留以前的图像?