如何使用 Django 嵌套对象添加 GraphQL 突变?

Posted

技术标签:

【中文标题】如何使用 Django 嵌套对象添加 GraphQL 突变?【英文标题】:How to add GraphQL Mutation with Django Nested Objects? 【发布时间】:2018-01-02 13:17:30 【问题描述】:

在我的项目中,我有一个名为 Workflows 的对象,它与另一个名为 DataSources 的对象具有 1:Many 关系。我非常接近能够使用 GraphQL Mutation 创建新工作流。以下是相关代码:

class DataSourceInput(graphene.InputObjectType):
    id = graphene.Int()
    database_name = graphene.String()
    table_name = graphene.String()

    @classmethod
    def get_node(cls, id, context, info):
        node = get_datasource(id)
        return node


class CreateWorkflow(relay.ClientIDMutation):
    class Input:
        name = graphene.String()
        description = graphene.String()
        datasources = graphene.List(DataSourceInput)

    workflow = graphene.Field(Workflow)
    success = graphene.Boolean()
    errors = graphene.String()

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

        try:
            workflow = WorkflowModel.create(name, description, datasources)
            return CreateWorkflow(workflow=workflow, success=True)

        except Exception as e:
            success = False
            return CreateWorkflow(workflow=None, success=False, errors=str(e))

似乎失败的是提取我希望与我正在创建的新工作流相关联的数据源。我收到一条错误消息,上面写着“不可散列的类型:'dict'”

我不知道这条错误消息到底在暗示我在做什么。

任何想法将不胜感激!

罗伯特

【问题讨论】:

你是怎么解决这个问题的? 【参考方案1】:

在python中,如果将其指定为字典键,可能会发生错误。 例如。

>>> a = dict()
>>> type(a)
<class 'dict'>
>>> a[[0]] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

在字典中,使用哈希函数来响应低成本处理的需求,避免在设置和获取值时通过eq进行整个搜索。

hashable 的一个例子是内置的 int、str、tuple、frozenset。

此上下文中的 dict 是 Graphql 请求。 所以首先检查查询中键的值是否是可散列的。 另外,最好把我请求的查询示例同时放上来。

【讨论】:

datasources = graphene.List(DataSourceInput) 这是不可散列的

以上是关于如何使用 Django 嵌套对象添加 GraphQL 突变?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何删除 Graphene Django 突变查询(中继)中的嵌套输入对象?

Django:如何遍历 html 中的嵌套 Json 对象

Django Admin Cookbook-23如何在Django admin中添加嵌套的内联

如何仅过滤嵌套的相关 django 对象?

如何在 django rest 框架中的嵌套序列化器相关对象上使用 prefetch_related?