如何使用 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 字段的项目数?
如何使用带有apollo-upload-client的graphene-file-upload将graphql中的文件上传到Python数据库并在前端做出反应。?