美文网首页
Django-->序列化的操作

Django-->序列化的操作

作者: fe3e18c7aab5 | 来源:发表于2019-05-31 15:27 被阅读0次

1. 基本查询

测试用例

# Django ORM
class StudentInfo(models.Model):
    name = models.CharField(max_length=20, verbose_name='姓名')
    birthday = models.DateField(verbose_name='生日', null=True)
    money = models.IntegerField(default=0, verbose_name='现金')
    image = models.ImageField(upload_to='studenttest', verbose_name='照片', null=True)

# 序列化器用例
from rest_framework import serializers

class StudentSerializer(serializers.Serializer)
    id = serializers.IntegerField(label='ID', read_only=True)
    name = serializers.CharField(label='姓名', max_length=20)
    birthday = serializers.DateField(label='生日', required=False)
    money = serializers.IntegerField(label='现金', required=False)
    image = serializers.ImageField(label='照片', required=False)
  • 单一对象查询
# 得到一个学生对象
student = StudentInfo.objects.get(id=2)

# 构造序列化器对象
serializer = StudentSerializer(student)

#获得序列化后的数据
print(serializer.data)
# {'id': 2, 'name': '小明', 'birthday': '1996-07-24', 'money': 36,  'image': None}

序列化器对象通过data属性可以获取序列化后的数据

  • 查询集QuerySet查询
# 得到所有的学生
students = StudentInfo.objects.all()

# 构造序列化器对象
serializers = StudentSerializer(students, many = True)

# 打印输出结果
print(serializers.data)
# [OrderedDict([('id', 1), ('name', '小花'), ('birthday', '1998-03-22'), ('money', 21), ('image', None]), OrderedDict([('id', 2), ('name', '小明'), ('birthday', '1996-07-24'), ('money', 36), ('image', None])]

如果要被序列化的是包含多条数据的查询集QuerySet,可以通过添加many=True参数补充说明

2. 关联外键嵌套查询

如果需要序列化的数据中包含有其他关联对象,则对关联对象数据的序列化需要指明

  • 比如:一个学生有外键对应的班级,那这个字段该如何显示?

测试用例

from rest_framework import serializers

# 班级类用例
class ClassInfo(models.Model):
    name = models.CharField(max_length=20, verbose_name='班级名称')
    Info = models.CharField(max_length=20, verbose_name='班级信息')

    class Meta:
        db_table = 'students'
    def __str__(self):
        return self.name

# 班级类序列化器用例
class ClassInfoSerializer(serializers.Serializer)
    name = serializers.CharField(label='班级名称', max_length=20)
    Info = serializers.CharField(label='班级信息', max_length=20)


# 学生类用例
class StudentInfo(models.Model):
    name = models.CharField(max_length=20, verbose_name='姓名')
    birthday = models.DateField(verbose_name='生日', null=True)
    money = models.IntegerField(default=0, verbose_name='现金')
    image = models.ImageField(upload_to='studenttest', verbose_name='照片', null=True)
    class Meta:
        db_table = 'students'
    def __str__(self):
        return self.name

# 学生类序列化器用例
class StudentSerializer(serializers.Serializer)
    id = serializers.IntegerField(label='ID', read_only=True)
    name = serializers.CharField(label='姓名', max_length=20)
    birthday = serializers.DateField(label='生日', required=False)
    money = serializers.IntegerField(label='现金', required=False)
    image = serializers.ImageField(label='照片', required=False)
    #定义外键字段
    hclass = serializers.PrimaryKeyRelatedField(label='班级', read_only=True)
    #hclass = serializers.StringRelatedField(label='班级', read_only=True)
    #hclass = ClassInfoSerializer(label='班级', read_only=True)
  1. PrimaryKeyRelatedField: 此字段将被序列化为关联对象的主键
student = StudentInfo.objects.get(id=2)
serializer = StudentSerializer(student)
print(serializer.data)
# {'id': 2, 'name': '小明', 'birthday': '1996-07-24', 'money': 36,  'image': None, 'hclass':2}
  1. StringRelatedField: 此字段将被序列化为关联对象的字符串表示方式(即模型类中__str__方法的返回值)
student = StudentInfo.objects.get(id=2)
serializer = StudentSerializer(student)
print(serializer.data)
# {'id': 2, 'name': '小明', 'birthday': '1996-07-24', 'money': 36,  'image': None, 'hclass':'九年级二班'}
  1. 使用关联对象的序列化器
student = StudentInfo.objects.get(id=2)

# 使用了自定义的序列化器
serializer = StudentSerializer(student)
print(serializer.data)
# {'id': 2, 'name': '小明', 'birthday': '1996-07-24', 'money': 36,  'image': None, 'hclass':OrderedDict([('id', 2), ('name', '九年级二班'), ('Info', '这里是九年级二班的信息')])}

many参数

如果关联的对象不止一个,比如一个班级会有多个学生,此时关联字段类型的指明仍可使用上述三种方式,只是在声明关联字段时,多补充一个many=True参数即可

# 班级类用例
class ClassInfoSerializer(serializers.Serializer)
    name = serializers.CharField(label='班级名称', max_length=20)
    Info = serializers.CharField(label='班级信息', max_length=20)
    studentinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True)  # 新增
serializer = ClassInfoSerializer(ClassInfo.objects.get(id=2))
print(serializer.data)
# {'id': 2, 'name': '九年级二班', 'info': 'xxxxxx', 'studentinfo_set': [1, 2, 9]} #1, 2, 9代表了字表中与之关联的学生id

相关文章

  • Django-->序列化的操作

    1. 基本查询 测试用例 单一对象查询 序列化器对象通过data属性可以获取序列化后的数据 查询集QuerySet...

  • Django-->反序列化的操作

    1. 验证 使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象在获取反序列...

  • Django-->Serializer序列化器

    模型类用例 这里设置一个Django ORM用来当作下面的测试用例 1. 手动定义一个序列化器 Django RE...

  • 序列化和反序列化对象

    被序列化的对象需要实现Serializable接口例子: 序列化和反序列化操作 结果:

  • IO流之 对象操作流

    对象操作流 核心代码无变化,所以不做多余记录 什么是对象操作流 将对象进行序列化操作和反序列化操作的流,读出就是序...

  • C#序列化

    序列化操作 序列化对象声明 对类使用序列化时,标注那些不需要序列化的字段。 序列化只能针对字段使用。 使用序列化相...

  • 序列化

    关键字tansient,修饰后代表不能被默认的序列化操作,但是我们可以手动的序列化操作对子类进行反序列操作时,如果...

  • transient

    取消序列化 transient修饰变量,在进行序列化操作时,会忽略。 被static不能被序列化 读取反序列化的对...

  • JAVA 笔记之 序列化与反序列化

    需求:把对象按照流一样的方式操作。对象流。序列化流。序列化:把对象按照流一样的方式操作。反序列化:把文件中的流对象...

  • Spark Core 性能调优之数据序列化

    操作场景 spark支持两种方式的序列化: ● Java 原生序列化 JavaSerializer ● Kryo ...

网友评论

      本文标题:Django-->序列化的操作

      本文链接:https://www.haomeiwen.com/subject/zwfgtctx.html