Вложенный сериализатор через общий внешний ключ - PullRequest
1 голос
/ 17 мая 2019

У меня три модели. Два из них связаны со своим «родителем» через внешний ключ. Мне нужно создать сериализатор.

Вот мой models.py

class Student(models.Model):
    first_name = models.CharField(max_length = 35, blank=True)
    last_name = models.CharField(max_length = 35, blank=True)


class Grade(models.Model):
    student = models.ForeignKey(
        "Student",
        null = True,
        on_delete = models.PROTECT,
    )
    grade = models.FloatField(null = True)


class Attendance(models.Model):
    student = models.ForeignKey(
        "Student",
        null = True,
        on_delete = models.PROTECT,
    )
    total_exabs = models.IntegerField(null = True)

Вот мой serializers.py

class StudentSerializer(serializers.BaseSerializer):
        def to_representation(self, student_obj):            
            return {
                "id": student_obj.pk,
                "first_name": student_obj.first_name,
                "last_name": student_obj.last_name,
            }

class GradeSerializer(serializers.BaseSerializer):
    def to_representation(self, grade_obj):
        return {
            "Grade PK": grade_obj.id,
            "Student": grade_obj.student.id,
            "Grade Value": grade_obj.grade,
        }

class AttendanceSerializer(serializers.BaseSerializer):
    def to_representation(self, attendance_obj):
        return {
            "student": attendance_obj.student.id,
            "total_exabs": attendance_obj.total_exabs,
        }

Как мне создать четвертый сериализатор, у которого посещаемость вложена в класс? По сути, мне нужно, чтобы каждый класс ученика также показывал их посещаемость.

Это то, что я хочу

{"grade_id": "1",
"grade" : "0.73",
"student_id": "1",
"attendance": {"attendance_id": "1", "total_exabs": "7"}}

Спасибо за любую помощь, которую вы можете предложить! Новичок в Django, так что спасибо за терпение!

1 Ответ

0 голосов
/ 18 мая 2019

Ваш serializers.py может быть, например:

class GradeSerializer(serializers.ModelSerializer):

    class Meta:
        model=Grade
        fields=["student", "grade"]


class AttendanceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Attendance
        fields = ["id", "total_exabs"]

class StudentSerializer(serializers.ModelSerializer):
    attendance_set = AttendanceSerializer(many=True)

    class Meta:
        model=Student
        fields=["id","first_name", "last_name", "attendance_set"]

Тогда вы можете написать:

>>> JSONRenderer().render(StudentSerializer(Student.objects.first()).data)
... b'{"id":1,"first_name":"st1f","last_name":"st1l","attendance_set":[{"id":1,"total_exabs":4},{"id":2,"total_exabs":5},{"id":3,"total_exabs":43}]}'

Обновление: Информация о граде вы можете включить точно так же:

class GradeSerializer(serializers.ModelSerializer):

    class Meta:
        model=Grade
        fields=["id", "grade"]

class StudentSerializer(serializers.ModelSerializer):
    grade_set = GradeSerializer(many=True)
    attendance_set = AttendanceSerializer(many=True)

    class Meta:
        model=Student
        fields=["id","first_name", "last_name", "attendance_set", "grade_set" ]

Если у каждого учащегося есть только одна оценка, вы должны иметь ForeignKey в модели учащегося для оценки, а не в модели оценки для учащегося

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...