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

问题描述 投票:0回答:1

虽然在过去,我使用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()

过去我用的是.NET语句。

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()

你可以看到在 mutate(..) 方式 DeleteUsers 类,我试图返回 deleted_users 能够在前端做一些类似于: "但是我还没有能够检索到用户的数据。我怎样才能实现呢?也许我遗漏了什么。

目前我试过的GraphQL查询是.Y和Z已经被删除。

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

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

先谢谢你了。

django graphql graphene-django
1个回答
0
投票

好吧,我终于知道问题出在哪里了(看来说说问题就解决了,下次我就用塑料鸭子试试)。

虽然 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 ...
    # ...
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.