类型为“ CreateUaction \”的字段“ createUaction \”必须具有子选项。”

时间:2018-12-24 07:33:54

标签: django graphql graphene-python

这是我第一次使用石墨烯,对此没有很好的了解。 因此,基本上是创建一个博客,用户可以在其中喜欢帖子,评论并将帖子添加到他的收藏夹中,并彼此关注。

我为所有用户操作制作了单独的模型

  class user_actions(models.Model):
      user = models.ForeignKey(User, on_delete=models.CASCADE)
      liked_post = models.ForeignKey(Post, related_name='post_likes', 
      on_delete=models.CASCADE)
      liked_comments = models.ForeignKey(Comment, 
      related_name='comment_likes', on_delete=models.CASCADE)
      fav = models.ForeignKey(Post, related_name='fav_post', 
      on_delete=models.CASCADE)
      target = models.ForeignKey(User, related_name='followers', 
      on_delete=models.CASCADE, null=True, blank = True)
      follower = models.ForeignKey(User, related_name='targets', 
      on_delete=models.CASCADE, null = True, blank = True)

      def __str__(self):
          return self.user.username

因此,我对所有操作进行了更改,我尝试遵循DRY Principe并将它们汇总为一个,在这里我可能做错了,新编码人员尽力而为:D

 class UactionInput(InputObjectType):
    liked_post_id = graphene.Int()
    fav_post_id = graphene.Int()
    comment_id = graphene.Int()
    target_id = graphene.Int()
    follower_id = graphene.Int()

 class CreateUaction(graphene.Mutation):
    user = graphene.Field(UactionType)

    class Arguments:
       input =  UactionInput()


    def mutate(self, info, input):
        user = info.context.user
        if not user.is_authenticated:
           return CreateUaction(errors=json.dumps('Please Login '))


        if input.liked_post_id:

            post = Post.objects.get(id=input.liked_post_id)
            user_action = user_actions.objects.create(
            liked_post = post,
            user = user 
              )

        return CreateUaction( user = user )

       if input.liked_comment_id:

            comment = Comment.objects.get(id=input.liked_comment_id)
            user_action = user_actions.objects.create(
            liked_comment = comment,
            user = user 
            )

        return CreateUaction(user = user )

       if input.fav_post_id:

        post = Post.objects.get(id=input.fav_post_id)
        user_action = user_actions.objects.create(
            fav = post,
            user = user 
        )

        return CreateUaction(user = user )

        if input.target_id:

          user = User.objects.get(id=input.target_id)
          user_action = user_actions.objects.create(
            target = user,
            user = user 
        )

        return CreateUaction(user = user )

       if input.follower_id:

          user = User.objects.get(id=input.follower_id)
          user_action = user_actions.objects.create(
            follower= user,
            user = user 
        )

        return CreateUaction(user = user )

对不起,我的问题是缩进,但是在我的代码中完全没问题。

createUaction突变给我这个错误

 "message": "Field \"createUaction\" of type \"CreateUaction\" must have a sub selection.",

感谢您的帮助。让我知道是否也需要发布解析器。

1 个答案:

答案 0 :(得分:3)

这不是您的架构问题,而是您发出请求的方式。

根据规范:

  

选择集主要由字段组成。一个字段描述了一个可用于在选择集中请求的离散信息。

     

某些字段描述复杂数据或与其他数据的关系。为了进一步探索此数据,字段本身可能包含选择集,允许进行深度嵌套的请求。所有GraphQL操作必须在返回标量值的字段中指定其选择,以确保响应的形状明确。

换句话说,每个字段都必须解析为具体值(例如标量或枚举)。如果字段解析为ObjectType,则必须至少请求该类型的字段之一。您选择的字段称为该字段的子选择。

该错误表明您缺少类型CreateUaction的子选择。您的请求应如下所示:

mutation SomeOperationName {
  createUaction {
    user {
      # one or more user fields
    }
  }
}