Что не так с темой GraphQL?
Сейчас я изучаю GraphQL на своем тестовом проекте с Django, и не могу понять, в чем проблема. Вот мой models.py
class Teacher(models.Model):
full_name = models.CharField(max_length=70, verbose_name="Full name")
subject = models.ManyToManyField(
"Subject", related_name="teacher_subject", verbose_name="Subject"
)
def __str__(self):
return self.full_name
class Subject(models.Model):
name = models.CharField(max_length=100, verbose_name="Subject name")
def __str__(self):
return self.name
class Meta:
verbose_name = "Subject"
verbose_name_plural = "Subjects"
ordering = ["name"]
class Student(models.Model):
full_name = models.CharField(max_length=70, verbose_name="Full name")
subject = models.ManyToManyField(
"Subject", related_name="student_subject", verbose_name="Subject"
)
avg_grade = models.FloatField(verbose_name="Average grade")
def __str__(self):
return self.full_name
Вот schema.py
import graphene
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from graphql_app.models import Student, Subject, Teacher
class TeacherType(DjangoObjectType):
class Meta:
model = Teacher
# fields = ("id", "full_name", "subject")
filter_fields = {
'id': ['exact'],
'full_name': ['exact', 'icontains', 'istartswith'],
}
interfaces = (graphene.relay.Node,)
class SubjectType(DjangoObjectType):
class Meta:
model = Subject
# fields = ("id", "name")
filter_fields = {'name': ['exact', 'icontains', 'istartswith']}
interfaces = (graphene.relay.Node,)
class StudentType(DjangoObjectType):
class Meta:
model = Student
# fields = ("id", "full_name", "subject")
filter_fields = {
'id': ['exact'],
'full_name': ['exact', 'icontains', 'istartswith'],
}
interfaces = (graphene.relay.Node,)
class Query(graphene.ObjectType):
teacher = graphene.relay.Node.Field(TeacherType)
subject = graphene.relay.Node.Field(SubjectType)
student = graphene.relay.Node.Field(StudentType)
teachers = DjangoFilterConnectionField(TeacherType)
subjects = DjangoFilterConnectionField(SubjectType)
students = DjangoFilterConnectionField(StudentType)
def resolve_teacher(self, info, **kwargs):
num = kwargs.get("id", None)
try:
return Teacher.objects.get(pk=num)
except Teacher.DoesNotExist:
return None
def resolve_subject(self, info, **kwargs):
num = kwargs.get("id", None)
try:
return Subject.objects.get(pk=num)
except Subject.DoesNotExist:
return None
def resolve_student(self, info, **kwargs):
num = kwargs.get("id", None)
try:
return Student.objects.get(pk=num)
except Student.DoesNotExist:
return None
def resolve_teachers(self, info):
return Teacher.objects.all()
def resolve_subjects(self, info):
return Subject.objects.all()
def resolve_students(self, info):
return Student.objects.all()
schema = graphene.Schema(query=Query)
Вот url.py
from django.contrib import admin
from django.urls import path
from django.views.decorators.csrf import csrf_exempt
from graphene_django.views import GraphQLView
from graphql_app.schema import schema
urlpatterns = [
path("admin/", admin.site.urls),
path("graphql/", csrf_exempt(GraphQLView.as_view(graphiql=True, schema=schema))),
]
Теперь, используя этот запрос, я ожидаю получить список элементов:
{
students(fullName_Icontains: "Jose") {
edges {
node {
id,
fullName
}
}
}
}
<
Либо этот запрос:
{
teacher(id: 2) {
id
fullName
}
}
вызывает "data": {"teacher": null}, считая, что учитель с таким ID существует в БД.
Что не так?