在单个 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
}
}
}
但它不起作用,说 users
是 null
...不知道如何检索查询中的用户。
提前致谢。
好吧,我终于弄明白是什么问题了(好像说一个问题就解决了,下次我用塑料鸭子试试)。
虽然 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 突变,但我想到这在我想一次删除多条记录的情况下并不理想,因为它最终是通过调用突变多次删除 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
}
}
}
但它不起作用,说 users
是 null
...不知道如何检索查询中的用户。
提前致谢。
好吧,我终于弄明白是什么问题了(好像说一个问题就解决了,下次我用塑料鸭子试试)。
虽然 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 ...
# ...
}
}