Django Rest Framework - Вложенная сериализация без вложенности - PullRequest
1 голос
/ 27 апреля 2019

Я хочу многоуровневый вложенный сериализатор.По сути, в каждой школе есть список учеников, и у каждого ученика есть список оценок.Он выводит этот

{"id":1,"name":"Sierra Grande Elem/Junior High"}

и выглядит так, как будто он не включает ни одно из созданных мною гнезд.

Вот мой models.py

class School(models.Model):
    name = models.TextField(max_length = 150, blank=True)

class Student(models.Model):
    current_school = models.ForeignKey(
        "School",
        null = True,
        on_delete = models.PROTECT,
    )
    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,
    )
    course = models.ForeignKey(
        "Course",
        null = True,
        on_delete = models.PROTECT,
    )
    grade = models.FloatField(null = True)

Вотmy serializers.py

class NestedSchoolSerializer(serializers.ModelSerializer):
    class Meta:
        model = School
        fields = ("id","name")

class NestedStudentSerializer(serializers.ModelSerializer):
    school_set = NestedSchoolSerializer(many = True, read_only = True)
    class Meta:
        model = Student
        fields = ("school_set","id","first_name","last_name")


class NestedGradeSerializer(serializers.ModelSerializer):
    student_set = NestedStudentSerializer(many = True, read_only = True)
    class Meta: 
        model = Grade
        fields = ("student_set","id","course","grade")

Вот мой файл views.py:

class SchoolInfo(generics.RetrieveAPIView):
    queryset = School.objects.all()
    serializer_class = NestedSchoolSerializer  

Вот мой файл url.py:

urlpatterns = [
    path('school/grade/<int:pk>/', views.SchoolInfo.as_view()),
  ]

Любая помощьочень признателен!Новичок в Django, и у него были проблемы со стрельбой в течение довольно долгого времени.Какую часть моего кода мне нужно изменить?

1 Ответ

1 голос
/ 27 апреля 2019

Добро пожаловать в переполнение стека!Похоже, вы на правильном пути, но вы перевернули вложенность.Ваш NestedSchoolSerializer ничего не знает о студентах, а NestedStudentSerializer не знает об оценках.Могут быть и другие проблемы, но это первое, что бросается в глаза.Вместо этого попробуйте что-то вроде этого:

class NestedGradeSerializer(serializers.ModelSerializer):
    class Meta: 
        model = Grade
        fields = ("id","course","grade")

class NestedStudentSerializer(serializers.ModelSerializer):
    grade_set = NestedGradeSerializer(many = True, read_only = True)
    class Meta:
        model = Student
        fields = ("grade_set","id","first_name","last_name")


class NestedSchoolSerializer(serializers.ModelSerializer):
    student_set = NestedStudentSerializer(many = True, read_only = True)
    class Meta:
        model = School
        fields = ("id", "name", "student_set")

Один из способов узнать, как настроить эти вещи, состоит в том, что по большей части поля в вашем сериализаторе должны отображаться на поля в той же модели (если вы используетеa ModelSerializer).

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