我想要一个多层次的嵌套序列化器。基本上,每所学校都有一个学生名单,每个学生都有一个成绩清单。它正在输出
{"id":1,"name":"Sierra Grande Elem/Junior High"}
并且看起来它不包括我创建的任何嵌套。
这是我的模型。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)
这是我的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的新手,在相当长的一段时间内一直无法解决这个问题。我需要更改代码的哪一部分?
答案 0 :(得分:1)
欢迎堆栈溢出!看起来您走在正确的轨道上,但是嵌套却倒置了。您的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")
知道如何设置这些内容的一种方法是,在大多数情况下,序列化程序中的字段应映射到同一模型中的字段(如果您使用的是ModelSerializer
)。