一.默认外键序列化
1.现在假设我们有两张表
class Teacher(models.Model):
tea_name = models.CharField(max_length=20,verbose_name='老师姓名')
class Meta:
verbose_name = '老师表'
verbose_name_plural = verbose_name
db_table = 'teacher'
def __str__(self):
return self.tea_name
class Student(models.Model):
stu_name = models.CharField(max_length=20,verbose_name='学生姓名')
score = models.IntegerField(verbose_name='成绩')
sex = models.CharField(max_length=5,verbose_name='性别')
teacher = models.ForeignKey(to=Teacher, on_delete=models.CASCADE, verbose_name='老师')
# teacher从表外键默认是tea_id,而不是tea_name
class Meta:
verbose_name = '学生表'
verbose_name_plural = verbose_name
db_table = 'student'
def __str__(self):
return self.stu_name
我们在从表student中的外键一般会显示为主表的id
如何将外键显示从id改为主表绑定字段的内容呢?
2.模块准备
from rest_framework import serializers
from student.models import Teacher,Student
1.StringRelated外键序列化
将关联表的__str__方法作为结果返回,设置read_only代表该字段不进行反序列化校验
使用外键表的str方法序列化
class StudentSerializer2(serializers.ModelSerializer):
teacher = serializers.StringRelatedField()
class Meta:
model = Student
fields = '__all__'
2.SlugRelated外键序列化
指定字段序列化 将某字段的内容更改为指定展示字段的内容
class StudentSerializer2(serializers.ModelSerializer):
teacher = serializers.SlugRelatedField(read_only=True,slug_field='tea_name')
class Meta:
model = Student
fields = '__all__'
3.PrimaryKeyRelated外键序列化
PrimaryKeyRelatedField外键序列化,使用外键表的主键进行序列化。跟原来的模型序列化器效果一样
class StudentSerializer2(serializers.ModelSerializer):
teacher = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = Student
fields = '__all__'
4.外键自定义序列化方式
使用自定义方法进行序列化,字段自定义,得是数据库里有的字段(名字自己起)
class StudentSerializer2(serializers.ModelSerializer):
tea_name = serializers.SerializerMethodField(read_only=True)
# obj就是模型类的对象
def get_tea_name(self,obj):
return obj.teacher.tea_name
class Meta:
model = Student
fields = '__all__'
二.关联序列化器反序列化
默认序列化器反序列化不需要写任何字段,默认的关联字段会接受一个id数据作为校验依据并创建
讲白了就是普通模型序列化器
class StudentSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = '__all__'