Python 通过共享外键的嵌套序列化程序

Python 通过共享外键的嵌套序列化程序,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,我有三种型号。其中两个通过外键连接到其“父级”。我需要创建一个序列化程序 这是我的模特 班级学生(models.Model): first_name=models.CharField(最大长度=35,空白=True) last_name=models.CharField(最大长度=35,空白=True) 班级等级(型号.型号): 学生=models.ForeignKey( “学生”, 空=真, 在_delete=models.PROTECT上, ) grade=models.FloatField

我有三种型号。其中两个通过外键连接到其“父级”。我需要创建一个序列化程序

这是我的模特

班级学生(models.Model):
first_name=models.CharField(最大长度=35,空白=True)
last_name=models.CharField(最大长度=35,空白=True)
班级等级(型号.型号):
学生=models.ForeignKey(
“学生”,
空=真,
在_delete=models.PROTECT上,
)
grade=models.FloatField(null=True)
课堂出勤率(models.Model):
学生=models.ForeignKey(
“学生”,
空=真,
在_delete=models.PROTECT上,
)
total_exabs=models.IntegerField(null=True)
这是我的serializers.py

class StudentSerializer(serializers.BaseSerializer):
def至_代表(自我、学生对象):
返回{
“id”:student_obj.pk,
“名字”:学生的名字,
“姓”:学生的姓,
}
类级序列化程序(serializers.BaseSerializer):
def至_表示(自身、等级_obj):
返回{
“等级PK”:等级对象id,
“学生”:年级对象学生id,
“等级值”:等级对象等级,
}
类AttendanceSerializer(serializers.BaseSerializer):
def至_代表(自身、出席对象):
返回{
“学生”:出席人数_obj.student.id,
“总成绩”:出勤率,
}
如何创建第四个序列化程序,该序列化程序将考勤嵌套在年级中?我基本上需要每个年级的学生也显示他们的出勤率

这就是我想要的

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

谢谢你能提供的任何帮助!Django新手,谢谢你的耐心

您的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,而不是在该学生的年级模型中使用ForeignKey

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,而不是该学生的年级模型中的ForeignKey?而不是
序列化程序。ModelSerializer
?没有理由!使用ModelSerializer更好吗?是的。。你在用什么
序列化程序。BaseSerializer
?而不是
序列化程序。ModelSerializer
?没有理由!使用ModelSerializer更好吗?是的。。这太棒了!我该如何整合毕业生信息呢?谢谢!但每个学生可以有多个年级。我该如何调整?我不能在学生身上有外键,我相信它必须在年级,我已经在更新中写下了你应该做什么。你不能做什么?谢谢你的帮助!我需要的出勤率是“低于”等级。我需要它看起来像这样:{出勤id:1,总考试次数:3,学生id:1,成绩集:{成绩id:7,成绩:0.73}。有什么想法吗?太好了!我该如何整合毕业生信息呢?谢谢!但每个学生可以有多个年级。我该如何调整?我不能在学生身上有外键,我相信它必须在年级,我已经在更新中写下了你应该做什么。你不能做什么?谢谢你的帮助!我需要的出勤率是“低于”等级。我需要它看起来像这样:{出勤id:1,总考试次数:3,学生id:1,成绩集:{成绩id:7,成绩:0.73}。有什么想法吗?