如何使用 GraphQL、Graphene 和 Relay 改变现有数据?

Posted

技术标签:

【中文标题】如何使用 GraphQL、Graphene 和 Relay 改变现有数据?【英文标题】:How do I mutate existing data with GraphQL, Graphene and Relay? 【发布时间】:2018-05-15 20:04:22 【问题描述】:

我觉得它应该记录在某个地方,但我找不到它。我可以通过突变将数据添加到我的数据库中,但我无法更改它。

Graphene 与 Django 一起工作,我的数据库是 SQLite

很具体,希望有人知道答案。除其他外,我尝试过:

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

AddSchoolNodeInput! 是哪里("U2Nob29sTm9kZToxMQ==" 是一个现有的 id):


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

它创建一个新项目并返回:


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

【问题讨论】:

【参考方案1】:

我可以通过向上述突变提供 ID 并在架构中执行此操作来编辑现有学校:

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)

它获取 ID,通过 if 语句将其从石墨烯 ID 传输到 django ID,并使用from_global_id,然后从数据库中获取它。如果它可以找到它会发生错误,因此不会创建新学校,只有在没有提供 id 的情况下。

不确定它是否是最佳做法,但它有效。

【讨论】:

我同意你的观点,一般来说缺乏关于突变的文档。出于这个原因,我在此链接上记录了我的操作方式:github.com/alexisrolland/flask-graphene-sqlalchemy/wiki/… 我不确定这是否是进行突变的好方法,但它也对我有用。 如果我想做if (Flase): return "message": "you can't do this requiest" 怎么办?我可以看看JsonResponse吗?

以上是关于如何使用 GraphQL、Graphene 和 Relay 改变现有数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django GraphQL JWT 和 Graphene Relay 进行身份验证和授权

使用 Graphene 和 SQLAlchemy 通过 GraphQL API 更新记录

如何将graphql模式导入graphene-python程序?

当我使用 Graphene 在 Django GraphQL API 中获取对象时,如何限制 ForeignKey 字段的项目数?

Graphene/GraphQL 查找特定列值

如何使用带有apollo-upload-client的graphene-file-upload将graphql中的文件上传到Python数据库并在前端做出反应。?