【发布时间】:2022-10-25 13:09:26
【问题描述】:
我在我的 django 应用程序中创建了以下模型:
class Post(models.Model):
title = models.CharField(max_length=125, unique=True)
slug_title = models.SlugField(max_length=255, unique=True)
body = models.TextField()
published_date = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
status = models.BooleanField(default=False)
class Meta:
ordering = ['-published_date']
def __str__(self):
return self.title
def save(self, *args, **kwargs):
self.slug_title = slugify(self.title)
super(Post, self).save(*args, **kwargs)
我希望以后能够使用 API 来执行 POST/GET 请求,所以我决定使用graphene-django。一切都已正确安装并正常工作。
根据教程,我创建了我的schema.py 文件,如下所示:
# define schema
class PostType(DjangoObjectType):
class Meta:
model = Post
fields = ('title', 'body', 'author', 'published_date', 'status', 'slug_title')
class UserType(DjangoObjectType):
class Meta:
model = get_user_model()
class PostInput(graphene.InputObjectType):
title = graphene.String()
slug_title = graphene.String()
body = graphene.String()
author = graphene.Int()
published_date = graphene.DateTime()
status=graphene.Boolean()
class CreatePost(graphene.Mutation):
class Arguments:
input = PostInput(required=True)
post = graphene.Field(PostType)
@classmethod
def mutate(cls, root, info, input):
post = Post()
post.title = input.title
post.slug_title = input.slug_title
post.body = input.body
post.author = input.author
post.published_date = input.published_date
post.status = input.status
post.save()
return CreatePost(post=post)
class Query(graphene.ObjectType):
all_posts = graphene.List(PostType)
author_by_username = graphene.Field(UserType, username=graphene.String())
posts_by_author = graphene.List(PostType, username=graphene.String())
posts_by_slug = graphene.List(PostType, slug=graphene.String())
def resolve_all_posts(root, info):
return Post.objects.all()
def resolve_author_by_username(root, info, username):
return User.objects.get(username=username)
def resolve_posts_by_author(root, info, username):
return Post.objects.filter(author__username=username)
def resolve_posts_by_slug(root, info, slug):
return Post.objects.filter(slug_title=slug)
class Mutation(graphene.ObjectType):
create_post=CreatePost.Field()
schema = graphene.Schema(query=Query, mutation=Mutation)
查询部分按预期工作,但我的突变部分似乎没有工作。当我尝试创建一个突变时,我得到以下信息:
{
"data": {
"create_post": {
"post": null
}
}
}
我创建了一个快速测试,以查看运行突变时是否会输出任何错误,但那里一切似乎都正常。
def test_mutation_1(self):
response = self.query(
'''
mutation {
createPost(input:{
title:"Test Title",
body:"Test body",
author:1,
publishedDate:"2016-07-20T17:30:15+05:30",
status:false
})
{
post {
title
}
}
}
'''
)
self.assertResponseNoErrors(response)
我没有收到错误消息。
任何帮助,将不胜感激!
【问题讨论】:
-
你有什么错误吗?
-
@jorzel 没有错误,但突变不起作用 - 不会创建新帖子。
-
你确定 response.get('errors') 是一个空数组吗? Graphene 总是返回 200,即使有错误。你能说明这个突变是怎么命名的吗?
-
@jorzel 我在这篇文章中添加了一个突变测试,我正在运行以查看一切是否正常。我没有收到任何错误消息。
-
@jorzel 我做了一个不同的测试,得到了这个错误信息->
errors=[GraphQLError('Cannot assign "1": "Post.author" must be a "User" instance.'