首页 > 解决方案 > 石墨烯总是在 Json 中返回“无”

问题描述

我对 GraphQL 和 Graphene 相当陌生,所以我很难理解我的代码有什么问题。我什至无法用最简单的 GraphQL 示例成功。这是我的代码:

models.py

class Task(models.Model):
task_name = models.CharField('Aufgabe', max_length=255)
project = models.ForeignKey(Project, on_delete=models.CASCADE)
done = models.BooleanField(verbose_name="Erledigt", default=False)

def __str__(self):
    return self.task_name

schema.py

class Task(models.Model):
task_name = models.CharField('Aufgabe', max_length=255)
project = models.ForeignKey(Project, on_delete=models.CASCADE)
done = models.BooleanField(verbose_name="Erledigt", default=False)

def __str__(self):
    return self.task_name

我在同一文件中的查询:

class TaskQuery(graphene.ObjectType):

all_tasks = graphene.List(TaskType)

def resolve_all_tasks(self, info, **kwargs):
    return Task.objects.all()

另一个查询功能:

class Query(graphene.ObjectType):
tasks = TaskQuery.all_tasks

projects = ProjectQuery.all_projects

这是我的schema.pyint 设置目录:

import graphene

from todo import schema 

class Query(schema.Query):
    pass

class Mutation(schema.Mutation):
    pass

schema = graphene.Schema(query=Query, mutation=Mutation)

打开 GraphiQL 时,我可以在文档中看到查询,但是当我尝试像这样使用此查询时(例如):

query {
  tasks{
    id
    taskName
    done
  }
}

它总是返回这个:

{
  "data": {
    "tasks": null
  }
}

虽然我很确定我的数据库中有应该显示在那里的条目。我已经检查了初学者教程的查看时间,我什至无法通过第一道障碍。有什么我想念的吗?

标签: pythondjangographene-django

解决方案


所以石墨烯很大程度上依赖于类型。我建议进行以下更改:

from graphene.relay import Node
from graphene import ObjectType, JSONField, String
from graphene_django import DjangoObjectType

from app.models import Task, Project

class TaskType(DjangoObjectType): # this is basically your nodes in the graph
    class Meta:
        filter_fields = {'id': ['exact']}
        model = Task
        interfaces = (Node,)

class ProjectType(DjangoObjectType): # FK should have a type as well
    class Meta:
        filter_fields = {'id': ['exact']}
        model = Project
        interfaces = (Node,)


class TasksQuery(ObjectType):
    task = Node.Field(TaskType)
    all_tasks = DjangoFilterConnectionField(TaskType)

在您的 schema.py 中进行以下更改:

import graphene

from todo import schema

class Query(schema.TasksQuery):
    pass

class Mutation(schema.Mutation):
    pass

schema = graphene.Schema(query=Query, mutation=Mutation)

然后使用查询:

query {
  allTasks {
    id
    taskName
    done
  }
}

让我知道这是否有效。


推荐阅读