当前位置: 首页 > 知识库问答 >
问题:

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

呼延宪
2023-03-14

虽然在过去我使用了删除单个记录的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()

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

目前,我尝试的GraphQL查询是:

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

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

提前感谢。

共有1个答案

万俟丁雷
2023-03-14

嗯,我终于弄明白了问题所在(似乎谈论一个问题就能解决它,下次我会尝试用塑料鸭子)。

虽然deleted_users是用户的正确列表,但我的突变的输出类型没有设置。

因此,解决方案是添加:

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 ...
    # ...
  }
}
 类似资料:
  • 在Spring-data-mongob中,我们可以从存储库的查询方法中返回单个已删除的对象吗,如下所示 如果始终存在通过上述查询删除的单个文档。 我试过了,但它抛出了异常,比如不能将Long转换为MyObject。我认为只支持void、long或List或Stream。有什么方法可以实现我想要做的吗?

  • 现在我有了新阵列 现在,现有的_array和新的_array都有名称值“b”,我希望它从新数组中移除

  • 我使用的是Android系统的图形ql阿波罗客户端。我能够使用单个字段的突变传递数据,没有任何问题。在突变中使用输入对象时,出现了无法读取未定义的电子邮件属性的错误。但是在浏览器中运行时,同样的图形ql工作。 Graphql突变 输入 API调用的Java代码

  • 我有以下模式: 模式反映了一个事实,即我必须返回一个对象。然而,我不能总是这样做,有时我需要返回null。例如,如果我向数据库发出请求,它将返回return object或null(如果找不到用户)。 在我的GraphQL模式中,我为特定字段设置了类型。如果我试图返回一个不同于我设置的类型,我会得到一个错误。如何允许字段返回对象或null?

  • 问题内容: 我有一个包含我的对象的数组。每个人都有财产。 有没有比我的数组中找到重复的帖子ID的更有效方法? 问题答案: 我将建议2解决方案。 两种方法都必须是平等的 使帖子符合可哈希和平等 在这里,我假设您的struct(或类)具有type 的属性。 解决方案1(丢失原始订单) 要删除重复的内容,您可以使用 解决方案2(保留订单)

  • 如何从javascript变量中删除对象/数组?