8

我开始用 GraphQl/Graphene 来解决我的问题。我正在构建一个连接到 MongoDB 的模式。到目前为止,一切似乎都有效,除了突变。我一直在关注这里这里的例子,但没有运气。有人可以指出我做错了什么吗?提前致谢。

import graphene

class GeoInput(graphene.InputObjectType):
    lat = graphene.Float(required=True)
    lng = graphene.Float(required=True)

    @property
    def latlng(self):
        return "({},{})".format(self.lat, self.lng)


class Address(graphene.ObjectType):
    latlng = graphene.String()


class CreateAddress(graphene.Mutation):

    class Arguments:
        geo = GeoInput(required=True)

    Output = Address

    def mutate(self, info, geo):
        return Address(latlng=geo.latlng)


class Mutation(graphene.ObjectType):
    create_address = CreateAddress.Field()


class Query(graphene.ObjectType):
    address = graphene.Field(Address, geo=GeoInput(required=True))
    def resolve_address(self, info, geo):
        return Address(latlng=geo.latlng)

schema = graphene.Schema(query=Query, mutation=Mutation)

上面的代码会产生这个错误:

AssertionError: CreateAddress 字段必须是一个映射(dict / OrderedDict),其中字段名称作为键或返回此类映射的函数。

4

6 回答 6

3

问题在于导入。我使用时遇到了同样的问题:

from graphene import ObjectType

我在docs的下一个示例中找到了如何正确导入它。这里是:

from graphene_django.types import DjangoObjectType
于 2019-08-05T14:33:46.567 回答
1

问题出在我安装的石墨烯版本上,安装石墨烯 2.0 解决了这个问题。

于 2017-10-15T04:42:32.720 回答
1

我的问题是我错误地声明了所有字段。这是我的类型:

class EventDateRangeType(DjangoObjectType):

    class Meta:
        model = EventDateRange
        fields = ('start', 'end')

但我的模型是:

class EventDateRange(models.Model):

    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()

所以start&end不匹配start_time& end_time。使它们相同解决了我的问题。

于 2020-10-13T14:49:49.330 回答
1

在你的突变中:

Output = Address

应该是石墨烯对象:

Output = graphene.Field(Address)
于 2022-01-28T17:39:51.377 回答
0

从“InputObjectType”继承的类有类似的错误。graphene解决方案是从而不是从导入“InputObjectType” graphql.type.tests.test_definition(不知道为什么首先从该库导入)

于 2020-10-18T10:55:03.097 回答
0

graphene.Mutation如果在继承类中没有指定输出,它甚至可能发生。但DevilWarior并非如此。

于 2022-01-24T11:35:31.203 回答