【问题标题】:Graphene/Django mutations return null石墨烯/Django 突变返回 null
【发布时间】: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.'

标签: django graphene-django


【解决方案1】:

错误:errors=[GraphQLError('Cannot assign "1": "Post.author" must be a "User" instance.'

解决方案:将我的 CreatePost 类更改为以下内容:

post.author = User.objects.get(pk=input.author_id)

代替:

post.author = input.author_id

【讨论】:

    【解决方案2】:

    嘿,你有没有找到任何解决方案,我面临同样的突变返回 null .. 请帮助

    【讨论】:

      猜你喜欢
      • 2020-09-01
      • 2019-01-19
      • 2017-03-18
      • 2021-12-17
      • 2022-01-17
      • 2018-01-11
      • 2020-02-09
      • 2018-12-06
      • 2020-05-08
      相关资源
      最近更新 更多