在单个 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
但它不起作用,说 users
是 null
... 不知道如何在查询中检索用户。
提前致谢。
【问题讨论】:
@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 突变参数?