У меня есть две модели Django - учитель и ученик, и у меня есть отношения многие ко многим. У учителей может быть несколько учеников, а у учеников - несколько учителей. Существует сквозная модель под названием «Замечания», где учитель может пометить ученика как любимого.
Я новичок в GraphQL. Я пытаюсь реализовать два запроса:1. Учителя и все их ученики2. Преподаватели и их любимые ученики
У меня проблемы с выполнением второго запроса, и я не смог этого сделать.
models.py
SUBJECTS = (
("Maths", "Maths"),
("Chemistry", "Chemistry"),
("Physics", "Physics")
)
class Student(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField(default=0)
def __str__(self):
return self.name
class Teacher(models.Model):
name = models.CharField(max_length=100)
subject = models.CharField(max_length=100, choices=SUBJECTS)
students = models.ManyToManyField(Student, through="Remarks")
def __str__(self):
return self.name
class Remarks(models.Model):
student = models.ForeignKey(Student, related_name="student", on_delete=models.DO_NOTHING)
teacher = models.ForeignKey(Teacher, related_name="teacher", on_delete=models.DO_NOTHING)
favorite = models.BooleanField(default=False, choices=(
(True, "Yes"),
(False, "No")
))
схема. py
import graphene
from graphene import relay, ObjectType
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from .models import Teacher, Student, Remarks
class RemarkNode(DjangoObjectType):
class Meta:
model = Remarks
filter_fields = ['favorite']
interfaces = (relay.Node, )
class TeacherNode(DjangoObjectType):
favorite = graphene.Field(RemarkNode)
class Meta:
model = Teacher
filter_fields = ['name', 'subject']
interfaces = (relay.Node, )
class StudentNode(DjangoObjectType):
class Meta:
model = Student
filter_fields = {
'name': ['exact', 'icontains', 'istartswith'],
'age': ['exact'],
'favorite': ['exact']
}
interfaces = (relay.Node, )
class Query(graphene.ObjectType):
teacher = relay.Node.Field(TeacherNode)
all_teachers = DjangoFilterConnectionField(TeacherNode)
student = relay.Node.Field(StudentNode)
all_students = DjangoFilterConnectionField(StudentNode)
def resolve_favorites(self, info, **kwargs):
teacher = Teacher.objects.get(pk=self.id)
remarks = Remarks.objects.filter(teacher=teacher)
return [each.student for each in remarks]