第十二单元 关联序列化处理

一.默认外键序列化

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__'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值