• Django5—关联字段序列化(父表获取从表字段、从表获取父表字段信息)


    父表:Project

    从表:Interface

    1.  父表获取从表字段 : 使用从表模型类名小_set

    a. 父表模型对象获取从表的数据,默认使用从表模型类名小_set

    b.在父表序列化器中,可以手动指定关联字段的序列化类型

    c.PrimaryKeyRelatedField,指定从表的主键id值

    d.PrimaryKeyRelatedField指定read_only=True,那么只输出从表外键id

    e.如果未指定read_only=True或者required=False,那么必须得指定queryset(指定校验时使用的查询集对象)

     interfaces_set = serializers.PrimaryKeyRelatedField(label='所属接口的id', help_text='所属接口的id',many=True, read_only=True)
    
     interfaces_set = serializers.PrimaryKeyRelatedField(label='所属接口的id', help_text='所属接口的id', many=True,queryset=Interfaces.objects.all())

     2.  父表获取从表字段 : 使用related_name

      在定义外键字段时,可以指定related_name参数,用于设置父表模型对象获取从表数据时,使用的属性名称(不指定的话默认 从表小写_set)

    interfaces/models.py
    
    projects = models.ForeignKey('projects.Projects', on_delete=models.CASCADE, related_name='interfaces')
    
    
    projects/serializers.py
    
    interfaces = serializers.PrimaryKeyRelatedField(label='所属接口的id', help_text='所属接口的id',  many=True, queryset=Interfaces.objects.all())

    3. StringRelatedField

    StringRelatedField用于在序列化输出时,调用关联模型类中的__str__方法

    StringRelatedField默认添加了read_only=True,只用于序列化输出,而不会反序列化输入

    interfaces = serializers.StringRelatedField(label='所属接口名称', help_text='所属接口名称', many=True)

    4. SlugRelatedField

    SlugRelatedField用于在序列化输出或者反序列化输入时,指定使用的关联模型类中的字段名

    如果未指定read_only=True或者required=False,那么必须得指定queryset(指定校验时使用的查询集对象)

    如果需要反序列化输入,那么slug_field必须得指定拥有唯一约束的字段名

    interfaces = serializers.SlugRelatedField(label='所属接口名称', help_text='所属接口名称', many=True,
                                                  slug_field='tester', queryset=Interfaces.objects.all())

    5. 父表获取从表所有信息 / 从表获取父表所有信息

      定义一个序列化器类,指定要返回的父表字段,然后将这个序列化器类作为子表Serializer中的字段即可;从表同理

    子表Serializer中的字段:命名用子表模型中的外键名

    父表Serializer中的字段:命名用related_name 或 从表模型类名小写_set

     

    从表中返回父表字段
    
    interfaces/serializers.py
    
    from rest_framework import serializers
    from projects.models import Projects
    
    class OneProjectsSerializer(serializers.Serializer):
        """
        定义一个序列化器类,指定要返回的父表字段
        """
        id = serializers.IntegerField()
        name = serializers.CharField()
        leader = serializers.CharField()
        is_execute = serializers.BooleanField()
        desc = serializers.CharField()
        create_time =serializers.DateTimeField()
        update_time = serializers.DateTimeField()
    
    class InterfacesSerializer(serializers.Serializer):
        id = serializers.IntegerField(label='id主键', help_text='id主键', required=False)
        name = serializers.CharField(label='接口名称', help_text='接口名称', max_length=15,
                                     error_messages={'max_length': 'name不能超过15字'})
        tester = serializers.CharField(label='测试人员', help_text='测试人员', max_length=10,
                                       error_messages={'max_length': 'tester不能超过15字'})
        create_time = serializers.DateTimeField(label='创建时间', help_text='创建时间', required=False, read_only=True)
        update_time = serializers.DateTimeField(label='更新时间', help_text='更新时间', required=False, read_only=True)
        # projects = serializers.StringRelatedField(label='所属项目名称', help_text='所属项目名称')
        # projects = serializers.PrimaryKeyRelatedField(queryset=Projects.objects.all(), label='项目id', help_text='项目id')
        projects = OneProjectsSerializer(label='获取父表projects所有信息',help_text='获取父表projects所有信息',read_only=True)
    
    
    
    interfaces/models.py
    
    from django.db import models
    
    class Interfaces(models.Model):
        id = models.AutoField(primary_key=True, verbose_name='id主键', help_text='id主键')
        name = models.CharField(verbose_name='接口名称', help_text='接口名称', max_length=15, unique=True)
        tester = models.CharField(verbose_name='测试人员', help_text='测试人员', max_length=10)
        create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', help_text='创建时间')
        update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', help_text='更新时间')
        projects = models.ForeignKey('projects.Projects', on_delete=models.CASCADE, related_name='interfaces')
    
  • 相关阅读:
    转载:《TypeScript 中文入门教程》 16、Symbols
    转载:《TypeScript 中文入门教程》 15、可迭代性
    在 docker 中(linux 系统)运行 sql server
    遇到一个在 sql server 查询中,条件语句不区分大小写的问题
    设置 MySQL 的时区
    js 控制浏览器全屏显示
    使用 bat 获取当前系统 ip 地址并生成快捷方式
    在 WinForm 中使用 Anchor 对控件进行定位
    在 WinForm 中获取嵌入的资源
    在 WinForm 窗体设计器中引用 x64 格式的程序集会发生错误
  • 原文地址:https://www.cnblogs.com/erchun/p/14364152.html
Copyright © 2020-2023  润新知