关于Django框架的关系模型序列化和一对多关系中的序列化解析

 更新时间:2023年05月18日 08:29:25   作者:想成为数据分析师的开发工程师  
序列化的意思是把字典的形式转化成Json格式。当我们展示数据的时候需要使用,反序列化的话,就是Json转成字典形式,存储数据时候使用,需要的朋友可以参考下

1.关系模型序列化

1.1 什么是序列化?什么是反序列化?

序列化的意思是把字典的形式转化成Json格式。当我们展示数据的时候需要使用。反序列化的话,就是Json转成字典形式,存储数据时候使用。

1.2 如何实现序列化与反序列化?

实现的方法就是,通过创建一个序列化类,继承serializers.ModelSerializer。在其中改写Meta类。具体效果看代码

1.3 代码展示

一对多模型

from django.db import models
# Create your models here.
class Classes(models.Model):
    name = models.CharField(max_length=20, verbose_name='班级名称')
class Student(models.Model):
    SEX_CHOICES = ((1,'男'),(2,'女'))
    name = models.CharField(max_length=20,verbose_name='姓名')
    age = models.IntegerField(null=True, blank=True, verbose_name='年龄')
    sex = models.IntegerField(choices=SEX_CHOICES,default=1,verbose_name='性别')
    # 多方建立外键
    classes = models.ForeignKey(Classes, on_delete=models.SET_NULL, null=True, verbose_name='班级')

序列化类

from rest_framework import serializers
from rest_app.models import *
class ClassesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Classes
        fields = ['id', 'name']
class StudentSerializer(serializers.ModelSerializer):
    # 新增班级属性
    classes = ClassesSerializer() # 一定要加括号,创建实例对象。否则,只能输出id
    class Meta:
        model = Student
        fields = ['id', 'name', 'age', 'sex','classes'] #或者 ='__all__'

创建好就是迁移模型啦,Django迁移模型方法可以参考本专栏之前的文章

在这里插入图片描述

2. 一对多关系的增删改查

2.1 代码展示

from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from rest_app.models import *
from rest_app.app_serializer import StudentSerializer,ClassesSerializer
from django.http import JsonResponse,HttpResponse
from rest_framework.parsers import JSONParser
###################一对多关系表的增删改查####################
# 完成新增 查询所有,路由相同,但是请求方式不同
@csrf_exempt # 关闭csrf中间件(防止利用cookie和token攻击网站)的使用
def classes(request):
    # 判断请求方式,完成新增和查询所有
    if request.method == 'GET':
        # 查询所有数据
        stu_list = Classes.objects.all() 
        # 序列化
        serializer = ClassesSerializer(stu_list, many=True)
        # 将json格式返回客户端
        return JsonResponse(serializer.data, safe=False)
    elif request.method == 'POST':
        # 新增数据
        # 使用JSONParaser调用parse()进行反序列化为字典
        data_dict = JSONParser().parse(request)
        # 将字典传入到序列化类中
        serializer = ClassesSerializer(data=data_dict)
        # 进行验证
        if serializer.is_valid():
            # 保存数据到数据库中
            serializer.save()
            # 返回新保存的数据  状态码 201
            return JsonResponse(serializer.data, status = 201)
        return JsonResponse(serializer.errors, status=400)
# 查询一个 删除   修改
@csrf_exempt # 关闭csrf中间件(防止利用cookie和token攻击网站)的使用
def classes_detail(request,pk):
    try:
        # 根据pk获取Classes
        classes = Classes.objects.get(pk=pk)
    except Classes.DoesNotExist: #无法获取到
        return HttpResponse(status=404)
    if request.method == 'GET':
        # 根据id查询指定的Student
        # 序列化——展示数据
        serializer = ClassesSerializer(classes)
        # 返回json数据
        return JsonResponse(serializer.data)
    elif request.method == 'PUT':
        # 根据id修改Student
        # 反序列化——获取需要使用的数据时使用
        data_dict = JSONParser().parse(request)
        # 将原来的对象 字典数据传入序列化类中
        serializer = ClassesSerializer(classes, data=data_dict)
        # 进行验证
        if serializer.is_valid():
            # 更新数据到数据库
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)
    elif request.method == 'DELETE':
        # 根据id删除classes
        classes.delete()
        return HttpResponse(status=200)

2.2 效果展示

查询单条数据

在这里插入图片描述

查询全部数据

在这里插入图片描述

POST请求插入信息

在这里插入图片描述

PUT请求修改数据

在这里插入图片描述

DELETE删除数据

在这里插入图片描述

3.一对多关系中在一方想获取多方数据并序列化方法

首先,在模型中的多方应该在外键中加入属性related_name,在模型的一方中,使用属性名记录多方的序列化后字段。在fields中添加入属性名。 模型

from django.db import models
# Create your models here.
class Classes(models.Model):
    name = models.CharField(max_length=20, verbose_name='班级名称')
class Student(models.Model):
    SEX_CHOICES = ((1,'男'),(2,'女'))
    name = models.CharField(max_length=20,verbose_name='姓名')
    age = models.IntegerField(null=True, blank=True, verbose_name='年龄')
    sex = models.IntegerField(choices=SEX_CHOICES,default=1,verbose_name='性别')
    # 多方建立外键
    classes = models.ForeignKey(Classes, related_name='students' ,on_delete=models.SET_NULL, null=True, verbose_name='班级')

序列化

from rest_framework import serializers
from rest_app.models import *
# 根据学生获取学生所在班级
# class ClassesSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Classes
#         fields = ['id', 'name']
# class StudentSerializer(serializers.ModelSerializer):
#     # 新增班级属性
#     classes = ClassesSerializer() # 一定要加括号,创建实例对象。否则,只能输出id
#     class Meta:
#         model = Student
#         fields = ['id', 'name', 'age', 'sex','classes'] #或者 ='__all__'
# 根据班级获取班级所有学生信息
class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = ['id', 'name', 'age', 'sex'] #或者 ='__all__'
class ClassesSerializer(serializers.ModelSerializer):
    # students 属性要和student类中外键classes属性 related_name='students'
    # 多条记录 指定many = True, read_only=True
    students = StudentSerializer(many=True, read_only=True) 
    class Meta:
        model = Classes
        fields = ['id', 'name','students']        

效果展示

在这里插入图片描述

4. 手动处理关系字段

在上述中,由于类的引用关系的原因,左右只能自动序列化一个关系字段,如果业务需求,需要2个关系字段都序列化,那么就需要使用到serializers.RelatedField类,手动处理字段关系。

序列化

from rest_framework import serializers
from rest_app.models import *
# 根据学生获取学生所在班级
# class ClassesSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Classes
#         fields = ['id', 'name']
# class StudentSerializer(serializers.ModelSerializer):
#     # 新增班级属性
#     classes = ClassesSerializer() # 一定要加括号,创建实例对象。否则,只能输出id
#     class Meta:
#         model = Student
#         fields = ['id', 'name', 'age', 'sex','classes'] #或者 ='__all__'
class ClassesRelatedField(serializers.RelatedField):
    def to_representation(self, value):
        return {'id':value.id, 'name':value.name}
# 根据班级获取班级所有学生信息
class StudentSerializer(serializers.ModelSerializer):
    # classes 属性名和Student类中外键属性名相同
    classes = ClassesRelatedField(read_only=True)
    class Meta:
        model = Student
        fields = ['id', 'name', 'age', 'sex','classes'] #或者 ='__all__'
class ClassesSerializer(serializers.ModelSerializer):
    # students 属性要和student类中外键classes属性 related_name='students'
    # 多条记录 指定many = True, read_only=True
    students = StudentSerializer(many=True, read_only=True) 
    class Meta:
        model = Classes
        fields = ['id', 'name','students']

在这里插入图片描述

到此这篇关于关于Django框架的关系模型序列化和一对多关系中的序列化解析的文章就介绍到这了,更多相关Django框架关系模型序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Selenium鼠标与键盘事件常用操作方法示例

    Selenium鼠标与键盘事件常用操作方法示例

    这篇文章主要介绍了Selenium鼠标与键盘事件常用操作方法,结合实例形式分析了Selenium鼠标事件与键盘事件常见方法与相关使用技巧,需要的朋友可以参考下
    2018-08-08
  • python函数enumerate,operator和Counter使用技巧实例小结

    python函数enumerate,operator和Counter使用技巧实例小结

    这篇文章主要介绍了python函数enumerate,operator和Counter使用技巧,结合实例形式总结分析了python内置函数enumerate,operator和Counter基本功能、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-02-02
  • python中sql解析库sqlparse基本操作指南

    python中sql解析库sqlparse基本操作指南

    sqlparse是用于Python的非验证SQL解析器,它提供了对SQL语句的解析,拆分和格式化的支持,这篇文章主要给大家介绍了关于python中sql解析库sqlparse基本操作指南的相关资料,需要的朋友可以参考下
    2024-08-08
  • 关于Pytorch的MNIST数据集的预处理详解

    关于Pytorch的MNIST数据集的预处理详解

    今天小编就为大家分享一篇关于Pytorch的MNIST数据集的预处理详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python容器使用的5个技巧和2个误区总结

    Python容器使用的5个技巧和2个误区总结

    在本篇文章里小编给大家整理的是关于Python容器使用的5个技巧和2个误区的相关知识点内容,需要的朋友们学习下。
    2019-09-09
  • python提取word文件中的所有图片

    python提取word文件中的所有图片

    办公中,偶尔会碰到一种情况,需要提取word文档中的图片,决定写这样一款工具自动提取图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • 在CentOS 7中使用Python 3执行系统命令的详细教程

    在CentOS 7中使用Python 3执行系统命令的详细教程

    使用os.system()这个方法简单直接,但它不返回命令的输出,只返回命令的退出状态,如果你只需要知道命令是否成功执行,这个方法就足够了,这篇文章主要介绍了在CentOS 7中使用Python 3执行系统命令的详细教程,需要的朋友可以参考下
    2024-02-02
  • python  UPX is not available问题解决方法

    python  UPX is not available问题解决方法

    这篇文章主要介绍了python UPX is not available问题解决,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Pytorch之保存读取模型实例

    Pytorch之保存读取模型实例

    今天小编就为大家分享一篇Pytorch之保存读取模型实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python设置 matplotlib 正确显示中文的四种方式

    python设置 matplotlib 正确显示中文的四种方式

    这篇文章主要介绍了python设置 matplotlib 正确显示中文的四种方式,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-05-05

最新评论