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

作者:想成为数据分析师的开发工程师 时间:2023-01-15 00:52:53 

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迁移模型方法可以参考本专栏之前的文章

关于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 效果展示

查询单条数据

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

查询全部数据

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

POST请求插入信息

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

PUT请求修改数据

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

DELETE删除数据

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

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']

效果展示

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

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框架的关系模型序列化和一对多关系中的序列化解析

来源:https://blog.csdn.net/m0_63953077/article/details/128151130

标签:Django,关系模型,序列化
0
投稿

猜你喜欢

  • 如何判断用户在某一页面逗留了多长时间?

    2010-01-18 20:48:00
  • 分析Python感知线程状态的解决方案之Event与信号量

    2022-05-11 07:23:35
  • Django通过json格式收集主机信息

    2022-03-23 19:58:49
  • 深入浅析Python的类

    2021-01-09 08:42:13
  • python的常见命令注入威胁

    2022-08-14 10:19:21
  • python tkinter与Mysql数据库交互实现账号登陆

    2024-01-21 19:02:39
  • Go语言基础go接口用法示例详解

    2024-04-30 10:06:53
  • GitLab使用外部提供的Redis缓存数据库的方法详解

    2024-01-23 10:02:57
  • SQL中DATEADD和DATEDIFF的用法示例介绍

    2024-01-27 16:57:58
  • Javascript 常见的高阶函数详情

    2024-04-18 09:30:22
  • Python高光谱遥感影像处理问题详细分析讲解

    2023-10-04 04:03:37
  • python闭包和装饰器你了解吗

    2022-01-11 00:46:02
  • Python脚本完成post接口测试的实例

    2022-01-01 15:40:22
  • mysql如何分别按年/月/日/周分组统计数据详解

    2024-01-17 14:28:01
  • js中将多个语句写成一个语句的两种方法小结

    2024-04-28 09:48:42
  • 使用Python写一个小游戏

    2023-07-20 17:31:07
  • 根据表中数据生成insert语句的存储过程

    2008-11-10 12:13:00
  • js实现简单放大镜特效

    2024-04-30 08:51:48
  • mysql 正则表达式查询含有非数字和字符的记录

    2024-01-15 11:26:21
  • SQL Server2019数据库之简单子查询的具有方法

    2024-01-21 23:27:31
  • asp之家 网络编程 m.aspxhome.com