Django--DRf---序列化器:序列化器嵌套

这篇具有很好参考价值的文章主要介绍了Django--DRf---序列化器:序列化器嵌套。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模型表:

from django.db import models

# Create your models here.

class StudentModel(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32,verbose_name='姓名')
    age = models.SmallIntegerField(verbose_name='年龄')
    class_mate_f = models.ForeignKey(to='ClassMateModel',on_delete=models.SET_NULL,null=True,
                                     related_name='students',related_query_name='students',db_constraint=False)

class ClassMateModel(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64,verbose_name='班级名')

class ClassMateDetail(models.Model):
    id = models.AutoField(primary_key=True)
    address = models.CharField(max_length=32,verbose_name='地址')
    class_mate_f = models.ForeignKey(to='ClassMateModel',on_delete=models.CASCADE,null=True,
                                     related_name='detail',related_query_name='detail',db_constraint=False)

class TeacherModel(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32,verbose_name='姓名')
    age = models.SmallIntegerField(verbose_name='年龄')
    phone = models.CharField(max_length=13,verbose_name='手机号码')
    class_mate_f = models.ManyToManyField(to='ClassMateModel',null=True,
                                          related_name='teachers',related_query_name='teachers',db_constraint=False)

#通过其他三张表的related_name 后,ClassMateModel就多了三个虚拟字段:students,teachers,detail

Django--DRf---序列化器:序列化器嵌套

一、外键在的一方

1、方式一:通过source来获取指定字段数据 【一对多和一对一的】

1.1、一对多 外键方
序列化器:
class StudentModelSerializer(serializers.ModelSerializer):
    class_mate_pk = serializers.CharField(source='class_mate_f.id')
    class_mate_name = serializers.CharField(source='class_mate_f.name')
    class Meta:
        model = models.StudentModel
        fields = ['id','name','class_mate_pk','age','class_mate_name']
        
 
视图函数:
#学生创建
class StudentGenericAPIView(GenericAPIView):
    authentication_classes = []
    queryset = models.StudentModel.objects.all()
    serializer_class = serializer.StudentModelSerializer
    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})
1.2、多对多 外键方 【不适应】

2、方式二:通过外键=序列化类() 【适用所有关系】

2.1、多对多:外键在这里

序列化器:

class ClassMateForTeacherModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.ClassMateModel
        fields = ['id','name']

class TeacherModelSerializer(serializers.ModelSerializer):
    class_mate_f = ClassMateForTeacherModelSerializer(many=True)
    class Meta:
        model = models.TeacherModel
        fields = ['id','name','age','phone','class_mate_f']

视图类:

class TeacherGenericAPIView(GenericAPIView):
    queryset = models.TeacherModel.objects.all()
    serializer_class = serializer.TeacherModelSerializer

    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})
2.2、一对多,外键方 【学生表,嵌套班级】
序列化器:
class ClassMateForStudentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.ClassMateModel
        fields = ['id','name']

class StudentModelSerializer(serializers.ModelSerializer):
    class_mate_f = ClassMateForStudentModelSerializer(read_only=True)
    class Meta:
        model = models.StudentModel
        fields = ['id','name','class_mate_f','age']
        
        
视图:
class StudentGenericAPIView(GenericAPIView):
    authentication_classes = []
    queryset = models.StudentModel.objects.all()
    serializer_class = serializer.StudentModelSerializer
    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})

3、方式三:通过depth 【适用所有关系】

起始表–外键-------------> 表1-外键--------------> 表2–外键------------->表3

这样,depth=4 ,会一直追踪外键,直达表中没有外键字段。

3.1、一对多:学生表- -外键----->班级表
#序列化器
class StudentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.StudentModel
        fields = ['id','name','class_mate_f','age']
        depth = 2 #等于表数

#视图 
class StudentGenericAPIView(GenericAPIView):
    authentication_classes = []
    queryset = models.StudentModel.objects.all()
    serializer_class = serializer.StudentModelSerializer
    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})
3.2、多对多:老师-外键------->班级
#序列化器
class TeacherModelSerializer(serializers.ModelSerializer):
    # class_mate_f = ClassMateForTeacherModelSerializer(many=True,read_only=True)
    class Meta:
        model = models.TeacherModel
        fields = ['id','name','age','phone','class_mate_f']
        depth =2 #涉及到的表数量
   
#视图
class TeacherGenericAPIView(GenericAPIView):
    queryset = models.TeacherModel.objects.all()
    serializer_class = serializer.TeacherModelSerializer

    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})
        

二、外键不在的一方[查询班级为例子]

【只能使用序列化器嵌套的方式】

注意:反向查询,都是通过反向查询字段=序列化器(many=True)

在这四张表中:ClassMateModel是没有一个外键字段,但是其他三张表都有ClassMateModel外键,

通过related_name, 在子查询时,就可以通过设置好的名字进行跨表,而且也查询结果是多个时也不需要使用_set了;

query_related_name 在联表查询时,通过设置好的名字进行跨表操作。

在查询班级信息时,需要班级详情信息、学生信息、老师信息;下面通过序列化器嵌套来实现

视图:

class ClassMateGenericAPIView(GenericAPIView):
    authentication_classes = []
    queryset = models.ClassMateModel.objects.all()
    serializer_class = serializer.ClassMateModelSerializer
    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})

序列化器:

#老师
class TeacherForClassMateMdoelserializer(serializers.ModelSerializer):
    class Meta:
        model = models.TeacherModel
        fields = ['id','name','phone']

#班级详情
class ClassDetailForClassMateModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.ClassMateDetail
        fields =['address']

#学生
class StudentForClassMate(serializers.ModelSerializer):
    class Meta:
        model = models.StudentModel
        fields = ['name','age']

#班级
class ClassMateModelSerializer(serializers.ModelSerializer):
    teachers = TeacherForClassMateMdoelserializer(many=True,read_only=True)
    detail = ClassDetailForClassMateModelSerializer(many=True,read_only=True)
    students = StudentForClassMate(many=True,read_only=True)
    class Meta:
        model = models.ClassMateModel
        fields =['id','name','teachers','students','detail']
        extra_kwargs = {
            'id':{'read_only':True},
            'teachers':{'read_only':True},
            'detail':{'read_only':True},
            'students':{'read_only':True},
        }

总结
1、通过related_name , ClassMateModel 相当于多了,students、teachers和detail 三个字段。
2、使用这三个字段来接收序列器对象,就可以实现序列化嵌套了。
3、注意,在实例化序列化器时,必须带上many=True 不然会报错。【因为外键不在当前模型类中,所有可能会有多个数据,即使是一对一的关系表,也要加many=true】
4、加上read_only=True ,不参与到反序列化中。如果该序列化器不参与反序列就无须写。

总结
1、通过related_name , ClassMateModel 相当于多了,students、teachers和detail 三个字段。
2、使用这三个字段来接收序列器对象,就可以实现序列化嵌套了。
3、注意,在实例化序列化器时,必须带上many=True 不然会报错。【因为外键不在当前模型类中,所有可能会有多个数据,即使是一对一的关系表,也要加many=true】
4、加上read_only=True ,不参与到反序列化中。如果该序列化器不参与反序列就无须写。文章来源地址https://www.toymoban.com/news/detail-430220.html

到了这里,关于Django--DRf---序列化器:序列化器嵌套的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Django】Task4 序列化及其高级使用、ModelViewSet

    Task4主要了解序列化及掌握其高级使用,了解ModelViewSet的作用,ModelViewSet 是 Django REST framework(DRF)中的一个视图集类,用于快速创建处理模型数据的 API 视图。 Django 的序列化是指将复杂的数据结构(通常是数据库中的模型对象)转换为可以在不同应用程序间传输和存储的格

    2024年02月11日
    浏览(43)
  • django rest_framework 框架动态设置序列化返回的字段

    动态修改字段可以使Django rest框架API像graphQL端点一样,只从模型中检索所需的字段。 一旦序列化器被初始化,就可以使用.fields属性访问序列化器上设置的字段字典。访问和修改此属性允许您动态修改序列化器。 显式地修改fields参数可以帮助您做一些奇怪的事情,例如在运行

    2024年02月16日
    浏览(49)
  • 由Django-Session配置引发的反序列化安全问题

    漏洞成因位于目标配置文件settings.py下 关于这两个配置项 SESSION_ENGINE: 在Django中, SESSION_ENGINE  是一个设置项,用于指定用于存储和处理会话(session)数据的引擎。 SESSION_ENGINE  设置项允许您选择不同的后端引擎来存储会话数据,例如: 数据库后端  ( django.contrib.sessions.b

    2024年02月08日
    浏览(47)
  • Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】

    相关文章: Django实现接口自动化平台(八)测试报告reports序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台_做测

    2024年02月16日
    浏览(44)
  • Django实现接口自动化平台(八)测试报告reports序列化器及视图【持续更新中】

    上一章: Django实现接口自动化平台(七)数据库设计_做测试的喵酱的博客-CSDN博客 下一章: 官方文档: Serializers - Django REST framework apps/reports/serializers.py 1.1.1 代码解释: 1、  exclude: You can set the  exclude  attribute to a list of fields to be excluded from the serializer. For example: 2、read_o

    2024年02月09日
    浏览(44)
  • Django实现接口自动化平台(十三)接口模块Interfaces序列化器及视图【持续更新中】

    相关文章: Django实现接口自动化平台(十二)自定义函数模块DebugTalks 序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测

    2024年02月17日
    浏览(41)
  • Django实现接口自动化平台(十一)项目模块Projects序列化器及视图【持续更新中】

    相关文章: Django实现接口自动化平台(十)自定义action names【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台_做测试的喵酱的博

    2024年02月16日
    浏览(41)
  • drf——Request源码分析、序列化组件、序列化类的使用(字段类和参数)、反序列化校验和保存

    views.py中 urls.py中 序列化类 字段 字段构造方式 BooleanField BooleanField() NullBooleanField NullBooleanField() CharField CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True) EmailField EmailField(max_length=None, min_length=None, allow_blank=False) RegexField RegexField(regex, max_length=None, min_length=None, a

    2024年02月05日
    浏览(39)
  • Django实现接口自动化平台(十二)自定义函数模块DebugTalks 序列化器及视图【持续更新中】

    上一章: Django实现接口自动化平台(十一)项目模块Projects序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台_做测

    2024年02月16日
    浏览(40)
  • Django实现接口自动化平台(十四)测试用例模块Testcases序列化器及视图【持续更新中】

    相关文章: Django实现接口自动化平台(十三)接口模块Interfaces序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台

    2024年02月17日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包