Как изменить существующие данные с помощью GraphQL, Graphene и Relay?

Я чувствую, что это должно быть где-то задокументировано, но я не могу его найти. Я могу добавить данные в свою базу данных с помощью мутации, но я не могу ее изменить.

Графен работает с Django, а моя БД — SQLite.

Это довольно конкретно, я надеюсь, что кто-то знает ответ. Среди прочего я пробовал:

mutation AppMutation(
  $input: AddSchoolNodeInput!
  ) {
    addSchool(input: $input) {
      school {
        id
        name
        description
     }     
    }
  }

где AddSchoolNodeInput! ("U2Nob29sTm9kZToxMQ==" — существующий идентификатор):

{
  "name": "edit kaas", 
  "description": "edit fails",
  "clientMutationId":"U2Nob29sTm9kZToxMQ=="
 } 

он создает новый элемент и возвращает это:

{
  "data": {
    "addSchool": {
      "school": {
        "id": "U2Nob29sTm9kZToxNA==",
        "name": "edit kaas",
        "description": "edit fails"
      }
    }
  }
}

person Joey van Breukelen    schedule 01.12.2017    source источник


Ответы (1)


Я смог отредактировать существующую школу, указав идентификатор вышеупомянутой мутации и сделав это в схеме:

class AddSchool(relay.ClientIDMutation):
    class Input:
        name = String()
        description = String()
        id = String()

    school = Field(SchoolNode)

    @classmethod
    def mutate_and_get_payload(cls, input, context, info):
        name = input.get("name")
        description = input.get("description")
        id = input.get("id")

        if id:
            id = from_global_id(id)[1]
            school = School.objects.get(id=id)
            if name:
                school.name = name
            if description:
                school.description = description

        else:
            school = School(
                name=name,
                description=description
            )

        school.save()

        return AddSchool(school=school)

Он захватывает идентификатор, помещает его через оператор if, передает его из идентификатора графена в идентификатор django с помощью from_global_id, а затем захватывает его из базы данных. Если он сможет найти его, произойдет ошибка, поэтому новая школа не будет создана, только если идентификатор не указан.

Не уверен, что это лучшая практика, но она работает.

person Joey van Breukelen    schedule 06.12.2017
comment
Я согласен с вами, что документация о мутациях в целом отсутствует. По этой причине я задокументировал, как я это делаю здесь, по этой ссылке: github.com/alexisrolland/flask-graphene-sqlalchemy/wiki/ Я не уверен, что это хороший способ делать мутации, но он работает и для меня. - person Alexis.Rolland; 04.02.2018
comment
что если я хочу сделать if (Flase): return {"message": "you can't do this requiest"} ? могу я увидеть JsonResponse? - person All; 14.03.2021