Django Отдых: как отфильтровать данные в дважды вложенных моделях сериализатора? - PullRequest
0 голосов
/ 12 января 2020

У меня есть модели:

class regularGrade(models.Model):
    lesson = models.ForeignKey(Timetable)
    studentID = models.ForeignKey(Student)
    ...

class Timetable(models.Model):
    subjectID = models.ForeignKey(Subject)
    cohortID = models.ForeignKey(Cohort)
    ...

class Subject(models.Model):
    cohortID = models.ForeignKey(Cohort)
    ...

class Cohort(models.Model):
    ...

class Student(models.Model):
    cohort = models.ForeignKey(Cohort, on_delete=models.CASCADE)
    ...

Я пытаюсь охватить всех обычных студентов всех 1-х групп по 1 предмету.
Я использую первый сериализатор, указанный выше, чтобы получить его:

class StudentGradesOneSubjectSerializer(serializers.ModelSerializer):
    regularGrades = RegularGradesBySubjectSerializer(many=True)

    class Meta:
        model = models.Student
        fields = ('studentName','pk','cohort','regularGrades',)
    def get_regularGrades(self, student):
        grades = models.regularGrade.objects.all()
        return grades

class RegularGradesBySubjectListSerializer(serializers.ListSerializer):

    def to_representation(self, data):
        **data = data.filter(lesson.subjectID=self.context["subjectID"])**
        return super(RegularGradesBySubjectListSerializer, self).to_representation(data)


class RegularGradesBySubjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.regularGrade
        fields = ('mark', 'lesson',)
        list_serializer_class = RegularGradesBySubjectListSerializer


Я пытаюсь отфильтровать по следующей строке:

data = data.filter(data.lesson.subjectID=self.context["subjectID"])

Однако это невозможно, поскольку идентификатор предмета урока не связан с обычным классом, это две разные модели.
Можно ли получить все оценки одной когорты ОДНОГО предмета?
Это то, что я получаю без фильтра (data = data):

[
    {
        "studentName": "Alexander Surname",
        "pk": 22,
        "cohort": 5,
        "regularGrades": [
            {
                "mark": 3,
                "lesson": 9
            },
        ]
    },
    {
        "studentName": "FirstName SecondName",
        "pk": 23,
        "cohort": 5,
        "regularGrades": [
            {
                "mark": 2,
                "lesson": 8
            }
        ]
    }
]

1 Ответ

0 голосов
/ 12 января 2020

Решение оказалось проще, чем я ожидал.

class StudentGradesOneSubjectSerializer(serializers.ModelSerializer):
    regularGrades = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = models.Student
        fields = ('studentName','pk','cohort','regularGrades',)
    def get_regularGrades(self, student):
        grades = models.regularGrade.objects.filter(lesson__subjectID=self.context["subjectID"])
        serializer = RegularGradesBySubjectSerializer(instance=grades, many=True)
        return serializer.data
...