序列化器嵌套共有三种声明方式,下面我会给大家逐一介绍,前提我已经建立好了学生、教师、课程、成绩四个表格,且已导入数据,模型如下:
models.py
from django.db import models
from django.utils import timezone as datatime
class Student(models.Model):
name = models.CharField(max_length=50, verbose_name="姓名")
age = models.IntegerField(verbose_name="年龄")
sex = models.BooleanField(default=False)
class Meta:
db_table = 'sch_student'
def __str__(self):
return self.name
class Course(models.Model):
name = models.CharField(max_length=50, verbose_name="课程名单")
teacher = models.ForeignKey("Teacher", on_delete=models.DO_NOTHING, related_name="course",db_constraint=False)
class Meta:
db_table = "sch_course"
def __str__(self):
return self.name
class Teacher(models.Model):
name = models.CharField(max_length=50, verbose_name="姓名")
sex = models.BooleanField(default=False)
class Meta:
db_table = "sch_teacher"
def __str__(self):
return self.name
class Achievement(models.Model):
score = models.DecimalField(default=0, max_digits=4, decimal_places=1, verbose_name="成绩")
student = models.ForeignKey(Student,on_delete=models.DO_NOTHING, related_name='s_achievement', db_constraint=False)
course = models.ForeignKey(Course,on_delete=models.DO_NOTHING, related_name='c_achievement', db_constraint=False)
create_dtime = models.DateTimeField(auto_created=datatime.now)
class Meta:
db_table = "sch_achievement"
def __str__(self):
return str(self.score)
一、直接声明模型
我们要在学生信息界面展示出该学生的成绩,就需要关联到成绩外键,需要在学生的序列化器中调用成绩序列化器
class AchievementModelSerializer(serializers.ModelSerializer):
class Meta:
model = Achievement
fields = "__all__"
class StudentModelSerializer(serializers.ModelSerializer):
# 在序列化器中调用另一个序列化器,就是序列化器嵌套
s_achievement = AchievementModelSerializer()
class Meta:
model = Student
fields = ['id','name','s_achievement']
结果如图:
二、利用source选项取代主键数值
通过source直接通过外键返回特定字段值
class AchievementModelSerializer(serializers.ModelSerializer):
# course = CourseModelSerializer()
# 直接调用别的模型里的外键字段
course_name = serializers.CharField(source="course.name")
teacher_name = serializers.CharField(source="course.teacher.name")
class Meta:
model = Achievement
fields = ['id','course_name','teacher_name','score','create_dtime']
class StudentModelSerializer(serializers.ModelSerializer):
# 在序列化器中调用另一个序列化器,就是序列化器嵌套
s_achievement = AchievementModelSerializer(many=True)
class Meta:
model = Student
fields = ['id','name','s_achievement']
结果如图:
三、直接指定关联深度属性-depth函数
depth = 1情况:
class AchievementModelSerializer(serializers.ModelSerializer):
class Meta:
model = Achievement
fields = ['id','course','score','create_dtime']
depth = 1
# 使用深度depth函数直接展示
"""
从成绩模型-->课程 ------ depth = 1
从成绩模型-->课程-->老师 ----- depth = 2
"""
class StudentModelSerializer(serializers.ModelSerializer):
# 在序列化器中调用另一个序列化器,就是序列化器嵌套
s_achievement = AchievementModelSerializer(many=True)
class Meta:
model = Student
fields = ['id','name','s_achievement']
如图:
depth = 2情况:
四、直接在模型类里自定义
models.py
直接在模型中定义achievement
class Student(models.Model):
name = models.CharField(max_length=50, verbose_name="姓名")
age = models.IntegerField(verbose_name="年龄")
sex = models.BooleanField(default=False)
class Meta:
db_table = 'sch_student'
def __str__(self):
return self.name
# 直接在模型中定义achievement
def achievement(self):
"""成绩列表"""
return self.s_achievement.values()
serializers.py
然后在序列化器中就可以直接添加该字段了
class StudentModelSerializer(serializers.ModelSerializer):
# 在序列化器中调用另一个序列化器,就是序列化器嵌套
# s_achievement = AchievementModelSerializer(many=True)
class Meta:
model = Student
fields = ['id','name','achievement']
结果如图:
序列化器嵌套的方式大概就这么几种,希望本篇文章对你有所帮助