在单个 GraphQL 突变(graphene-django)中返回已删除对象的数组

Posted

技术标签:

【中文标题】在单个 GraphQL 突变(graphene-django)中返回已删除对象的数组【英文标题】:Returning array of deleted objects in single GraphQL mutation (graphene-django) 【发布时间】:2020-08-13 09:00:57 【问题描述】:

虽然过去我使用删除单个记录的 GraphQL 突变,但我想出这样的想法,即在我想一次删除多条记录的情况下这并不理想,因为它最终通过调用删除的突变1 记录多次(在一个循环中),这会导致通过网络进行多次 API 调用。

所以我决定改为修改突变以接受有一个参数,即我可以在后端循环的对象或 ID(无论什么)列表。通过这样做,它只调用 1 次 API 并删除所有记录。

我设法做到了,我面临的唯一障碍是return 语句。我不知道怎么写。

所以如果我有一个模型(在我的架构中),例如:

class UserType(DjangoObjectType):
  class Meta:
    model = User
    fields = (
        'id',
        'username',
        'password',
        'first_name',
        'last_name',
        'is_active',
        'group_ids',
    )

  full_name = graphene.String()
  full_identification = graphene.String()

过去我用过:

class DeleteUser(graphene.Mutation):
  username = graphene.String()

  class Arguments:
    id = graphene.ID()

  def mutate(self, info, **kwargs):
    user = get_object_or_404(User, id=kwargs['id'])
    user.delete()
    return user

class Mutation(graphene.ObjectType):
  delete_user = DeleteUser.Field()

但现在我想做一些事情,例如:

class DeleteUsers(graphene.Mutation):
  users = graphene.List(UserType)
  username = graphene.String()

  class Arguments:
    ids = graphene.List(graphene.ID)

  def mutate(self, info, **kwargs):
    deleted_users = []
    for user in User.objects.filter(id__in=kwargs['ids']):
        user.delete()
        deleted_users.append(user)
    return deleted_users

class Mutation(graphene.ObjectType):
  delete_users = DeleteUsers.Field()

您可以在DeleteUsers 类的mutate(..) 方法中看到,我尝试返回deleted_users 以便能够在前端执行类似的操作:“用户X、Y 和Z 已被删除”。 但是我无法检索用户的数据。我怎样才能实现它?也许我错过了什么。

目前我尝试的 GraphQL 查询是:

mutation 
    deleteUsers(
        ids: [5,6,7],
    ) 
        users 
            username
    
  

但它不起作用,说 usersnull... 不知道如何在查询中检索用户。

提前致谢。

【问题讨论】:

@xadm 问题不在于收集名称。我必须返回整个用户的列表,以便在突变完成后我可以对他们做任何我想做的事情。问题更多:如何在graphql中返回对象列表。当我执行return deleted_users 时,列表是正确的,但我不知道如何进行 GraphQL 突变以正确使用它(在您可以运行查询的 graphql 页面中) 定义一个用户数组作为返回类型 是的,在这一切之后我才想通。似乎解释一个问题解决了这个问题......下次我会尝试使用塑料鸭子。不管怎么说,还是要谢谢你 !事实上,我必须做一个 Meta 类,我在其中设置了 output = graphene.List(UserType) 【参考方案1】:

嗯,我终于弄清楚是什么问题了(好像说个问题就解决了,下次我用塑料鸭子试试)。

虽然deleted_users 是用户的正确列表,但我的突变的ouput type 没有设置。

所以解决方案是添加:

class Meta:
  output = graphene.List(UserType)

在我的突变中

导致:

class DeleteUsers(graphene.Mutation):

  class Arguments:
    ids = graphene.List(graphene.ID)

  class Meta:
    output = graphene.List(UserType)

  def mutate(self, info, **kwargs):
    deleted_users = []
    for user in User.objects.filter(id__in=kwargs['ids']):
        user.delete()
        deleted_users.append(user)
    return deleted_users

可以通过以下方式调用:

mutation 
    deleteUsers(
        ids: [5,6,7],
    ) 
    username
    firstName
    # ...
    # And other fields ...
    # ...
  

【讨论】:

以上是关于在单个 GraphQL 突变(graphene-django)中返回已删除对象的数组的主要内容,如果未能解决你的问题,请参考以下文章

在单个 GraphQL 突变(graphene-django)中返回已删除对象的数组

FaunaDB - 如何批量更新单个 graphQL 突变中的条目列表?

如何将对象列表或数组传递到旨在更新单个对象的 GraphQL 突变中?

如何将单个枚举用于 django 模型和 graphql 突变参数?

GraphQL CodeGen - 使用单个请求执行任意次数的相同突变

使用输入对象的graphql突变