【发布时间】:2021-02-01 21:37:30
【问题描述】:
如何编写嵌套外键的架构和查询?我检查了文档,没有发现如何执行此操作的示例。所以这是我基于 github 和 stackoverflow 答案的尝试,可以说我有这些模型:
class Address(models.Model):
name = models.CharField()
class Person(models.Model):
name = models.CharField()
address = models.ForeignKey('Address', on_delete=models.CASCADE, blank=False, null=False)
class Blog(models.Model):
person = models.ForeignKey('Person', on_delete=models.CASCADE, blank=False, null=False)
text = models.TextField()
我尝试编写这样的架构:
class AddressInput(graphene.InputObjectType):
name = graphene.String(required=True)
class PersonInput(graphene.InputObjectType):
name = graphene.String(required=True)
address =graphene.Field(AddressInput)
class CreateNewBlog(graphene.Mutation):
blog=graphene.Field(BlogType)
class Arguments:
address_data = AddressInput()
person_data = PersonInput()
text = graphene.String()
@staticmethod
def mutate(root, info, person_data=None, address_data=None, **input):
address = Address.objects.create(name=address_data.name)
person = Person.objects.create(address=address, name=person_data.name)
blog = Blog.objects.create(person =person, text=input['text'])
blog.save()
return CreateNewBlog(blog=blog)
我使用了这样的查询:
mutation {
CreateNewBlog(person: { address: {name: "aaa"},
name: "First Last" }, text: "hi hi") {
Blog {
person{
name
address{
name
}
},
text
}
}
}
我收到此错误消息:
{
"errors": [
{
"message": "'NoneType' object has no attribute 'name'",
"locations": [
{
"line": 32,
"column": 9
}
],
"path": [
"CreateNewBlog"
]
}
],
"data": {
"CreateNewBlog": null
}
}
我认为问题在于我编写 schema.py 文件的方式。将 InputFields 嵌套在另一个 InputField 中不起作用的地方。还有其他方法可以编写单个突变吗?
【问题讨论】:
-
具体的错误信息好像和这个stackoverflow.com/questions/49809261/…有关。 -- 我建议您首先检查您的代码是否达到
blog.save。如果是这样,。问题在于格式化响应。 -
@MarkChackerian 我不认为它达到了与
{name: "aaa"}部分冲突的程度。与 schema.py 部分存在匹配问题。 -
我不认为你需要 "address = graphene.Field(AddressType)" 和 "person=graphene.Field(PersonType)" 行——那是你放置输出的地方,不输入。而你只想输出“blog”的值。
-
@MarkChackerian 我想创建这两个模型。如果我删除它,它仍然会给出同样的错误。
标签: python-3.x django graphql graphene-django