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

Returning array of deleted objects in single GraphQL mutation (graphene-django)

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

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

我设法做到了,我面临的唯一障碍是 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 class 的 mutate(..) 方法中看到我尝试 return deleted_users 能够执行类似的操作: "Users X, Y and Z have been deleted" 在前端。 但是我无法检索用户的数据。我怎样才能实现它?也许我错过了什么。

目前我尝试的 GraphQL 查询是:

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

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

提前致谢。

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

虽然 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 ...
    # ...
  }
}