如何使用动态别名在单个请求中多次调用 GraphQL 突变
How to call a GraphQL mutation multiple times within a single request, using dynamic aliases
我在前端使用 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 and the one by marktani in 中的回答几乎可以满足我的需求,除了我希望它是动态的,而事先不知道会插入多少次。
他们的帖子已经有一段时间了,所以我想知道今天是否有一个简单的解决方案,或者我是否应该继续修改我的后端以接受列表而不是单一课程的突变?
您需要更新后端以适应列表输入,因为 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 而不是人们输入它吗?
我在前端使用 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 and the one by marktani in
他们的帖子已经有一段时间了,所以我想知道今天是否有一个简单的解决方案,或者我是否应该继续修改我的后端以接受列表而不是单一课程的突变?
您需要更新后端以适应列表输入,因为 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 而不是人们输入它吗?