在graphene-django中实现批量删除GraphQL mutation并返回删除对象数组
解决GraphQL批量删除mutation返回数据为null的问题
我来帮你搞定这个问题!你遇到的核心问题是mutation的返回值不符合GraphQL的类型约定:你直接返回了deleted_users列表,但GraphQL期望的是DeleteUsers类的实例,而不是一个原始数组,这就导致前端无法正确解析users字段,最终得到null。
问题分析
你的DeleteUsers类定义了users作为返回字段(类型是graphene.List(UserType)),但在mutate方法里直接返回了用户列表,GraphQL不知道如何把这个列表映射到DeleteUsers类型的users属性上,因此前端查询时users字段始终为null。
解决方案
修改mutate方法,创建DeleteUsers类的实例,将删除的用户列表赋值给实例的users属性后再返回。同时我们可以优化删除逻辑,用批量删除替代循环删除,提升性能。
修改后的代码如下:
class DeleteUsers(graphene.Mutation): users = graphene.List(UserType) class Arguments: ids = graphene.List(graphene.ID) def mutate(self, info, **kwargs): # 先获取要删除的用户集合,保存到内存中(删除后数据库中就不存在了) target_users = User.objects.filter(id__in=kwargs['ids']) deleted_users = list(target_users) # 批量删除,比循环调用user.delete()更高效 target_users.delete() # 返回DeleteUsers类的实例,将删除的用户列表赋值给users字段 return DeleteUsers(users=deleted_users)
为什么这样可行?
- 符合GraphQL类型约定:返回
DeleteUsers实例后,GraphQL能正确识别users字段对应的数组数据,前端就能正常获取到已删除用户的信息。 - 性能优化:用
queryset.delete()批量删除,避免了循环调用数据库的开销,比原来的循环删除效率更高。 - 数据可用性:虽然我们先删除了数据库中的记录,但在删除前已经把用户对象保存到了内存列表
deleted_users中,所以依然可以返回这些用户的信息给前端用于展示提示。
测试你的查询
现在执行你原来的GraphQL查询:
mutation { deleteUsers( ids: [5,6,7], ) { users { username } } }
前端就能正确获取到已删除用户的username列表,进而展示类似“用户X、Y、Z已删除”的提示信息了。
内容的提问来源于stack exchange,提问作者lbris
相关产品推荐
相关产品推荐

