如何使用动态别名在单个请求中多次调用 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() 时如何保留以前的图像?

为啥 Angular 2+ innerHTML 在单个语句中多次调用方法,如何解决这个问题

在单个命令行中多次调用同一子命令

第十六章 创建高级联结

从单个服务多次调用多个微服务的最佳方法或设计模式是啥?