Day12-关联序列化处理

1.关联序列化器序列化

1.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(Teacher,on_delete=models.CASCADE,verbose_name='老师')
    class Meta:
        verbose_name = '学生表'
        verbose_name_plural = verbose_name
        db_table = 'student'
    def __str__(self):
        return self.stu_name

编写序列化器

from rest_framework import serializers
from student.models import Teacher,Student
class TeacherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Teacher
        fields = '__all__'

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = '__all__'

1.2 StringRelated外键序列化

字段不可进行反序列化

class StudentSerializer2(serializers.ModelSerializer):
    teacher = serializers.StringRelatedField()
    class Meta:
        model = Student
        fields = '__all__'

1.3 SlugRelated外键序列化

只能序列和查询

class StudentSerializer2(serializers.ModelSerializer):
    #teacher = serializers.StringRelatedField()
    teacher = serializers.SlugRelatedField(read_only=True, slug_field='tea_name')
    class Meta:
        model = Student
        fields = '__all__'

1.4 PrimaryKeyRelated外键序列化

只能序列化,返回主键

class StudentSerializer2(serializers.ModelSerializer):
    # 1.使用外检表的str方法进行序列化
    # teacher = serializers.StringRelatedField()
    # 2.指定字段进行序列化
    # teacher = serializers.SlugRelatedField(read_only=True, slug_field='tea_name')
    # 3.使用外键表的主键进行序列化
    # teacher = serializers.PrimaryKeyRelatedField(read_only=True)
    class Meta:
        model = Student
        fields = '__all__'

1.5 外键自定义序列化方式

class StudentSerializer2(serializers.ModelSerializer):
    # 4,.使用自定义方法进行序列化,字段自定义(名字自己起)
    tea_name = serializers.SerializerMethodField(read_only=True)
    def get_tea_name(self,obj):
        return obj.teacher.tea_name
    class Meta:
        model = Student
        fields = '__all__'

2 关联序列化器反序列化

2.1 默认关联反序列化方式

    def post(self,request):
        #使用序列化器对数据进行反序列化
        ser = StudentSerializer(data = request.data)
        if ser.is_valid(raise_exception=True):
            ser.save()
            return Response({'msg':'success'},status=201)
        return Response({'msg':'error'})

总结

错误

在这里插入图片描述

解决

是因为添加数据的时候括号后边多加的逗号而引发的错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值