Возвращение массива удаленных объектов в одной мутации GraphQL (графен- django) - PullRequest
0 голосов
/ 29 апреля 2020

Хотя в прошлом я использовал мутацию GraphQL, которая удаляет одну запись, мне пришла в голову мысль, что это не идеально, если я хочу удалить несколько записей одновременно, так как в итоге вызываю мутацию, которая удаляет 1 запись несколько раз (в al oop), что приводит к нескольким вызовам API по сети.

Поэтому я решил вместо этого изменить мутацию, чтобы принять, имеет аргумент - список объектов или идентификаторов (что угодно) на что я могу l oop в бэкэнде. Делая это, он делает только 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()

В методе mutate(..) класса DeleteUsers вы можете увидеть, что я пытаюсь вернуть deleted_users, чтобы иметь возможность сделать что-то вроде: «Пользователи X, Y и Z были удалены» во внешнем интерфейсе. Но я не смог получить данные пользователей. Как мне этого добиться? Может быть, я что-то упускаю.

В настоящее время запрос GraphQL, который я пробовал для этого:

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

, но он не работает, говоря, что users - это null ... Не знаю, как я могу получить пользователей в запросе.

Заранее спасибо.

1 Ответ

0 голосов
/ 29 апреля 2020

Ну, я наконец-то понял, в чем была проблема (кажется, разговор о проблеме решает ее, в следующий раз я попробую с пластиком c утка).

Хотя 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 ...
    # ...
  }
}
...