python - 通过共享外键嵌套序列化程序
问题描述
我有三个模型。其中两个通过外键连接到它们的“父级”。我需要创建一个序列化程序。
这是我的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 新手,感谢您的耐心等待!
解决方案
您的 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" ]
如果每个学生只有一个成绩,则该成绩的 Student 模型中必须有 ForeignKey,而不是学生的 Grade 模型中
推荐阅读
- c++ - 必须使用 'class' 标签来引用此范围内的类型 '____'
- hadoop - Hadoop 'put' 命令:没有这样的文件或目录
- uikit - 直接调用 UIResponder.resignFirstResponder 可以吗?
- angular - Angular 7中的数组有问题
- templates - 模板函数成员变量
- javascript - Sinon Stub 单元测试
- java - JSONException: courseDivide 没有值
- html - 通过css将鼠标悬停在链接上时尝试显示隐藏的导航元素
- apache-zookeeper - 领导者选举:Etcd vs Zookeeper vs Hazelcast
- mysql - 在哪里设置会话时区(MySql)