我开始用GraphQl / Graphene包围我的头脑。我正在构建一个连接到MongoDB的模式。到目前为止所有似乎都有效,除了突变。我一直在关注示例here和here但没有运气。有人能指出我做错了吗?提前谢谢。
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),字段名称为键或返回此类的函数 映射。
答案 0 :(得分:2)
问题在于我安装的石墨烯版本,安装石墨烯2.0解决了这个问题。
答案 1 :(得分:1)
问题出在导入中。 使用时遇到了同样的问题:
from graphene import ObjectType
在下一个示例中,我已经找到了如何从docs正确导入它。在这里:
from graphene_django.types import DjangoObjectType
答案 2 :(得分:0)
我的问题是我没有正确声明所有字段。这是我的类型:
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
不匹配。使它们相同可以解决我的问题。
答案 3 :(得分:0)
从“ InputObjectType”继承的类具有类似的错误。解决方案是从graphene
而不是从graphql.type.tests.test_definition
导入“ InputObjectType”(不知道为什么首先从该库中导入它)