调研:浅淡Django中多种序列化的方案及其性能

目前,web系统在前后端分离,通过API通信的大环境下,JSON序列化是后端必不可少的工作,在Jango中常用的序列化方案有多种,我很好奇它们之间有何种区别,什么情况下性能最佳,于是有了这次的调研。

  • 首先弄清楚什么是序列化:

python已经集成了自己的序列化模块,如 json,其中的 json.dumps、和json.loads,就能实现字典和json字符串的转换。

实际上所谓的序列化,就是将字典转换成符合字典格式的字符串,反序列化则就是将其倒过来。

# type:dict
dict_object = {"id": 1, "name": "王二狗", "age": 18}

# type:str
json_str = '{"id": 1, "name": "王二狗", "age": 18}'
  • 介绍序列化方案前,展示下我定义的model:
from django.db import models


class PersonInfo(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20)
    age = models.IntegerField()
    hireDate = models.DateField()

    def __str__(self):
        return str(self.id)

    class Meta:
        verbose_name = '人员信息'


class Vocation(models.Model):
    id = models.AutoField(primary_key=True)
    job = models.CharField(max_length=20)
    title = models.CharField(max_length=20)
    payment = models.IntegerField()
    name_id = models.IntegerField()

    def __str__(self):
        return str(self.id)

    class Meta:
        verbose_name = '职业信息'
  • Djano中自带的序列化方案和常见的第三方序列化方案:
  1. JsonResponse 
  2. from django.core import serializers  
  3. from rest_framework import serializers

其中,前两种,是Django自带的序列化方案,后者则是rest_framwork中所带的序列化方案,当然想要序列化还有很多方案,这里只列出几种常用的。


  • 基础介绍:

JsonResponse  使用起来十分简单,只要将你要返回的内容以字典的形式传入其中,就能给前端返回相对应的Json字符串,如下图。

class TestView(View):
    sql = "SELECT * FROM index_vocation"
    column_list = ['id', 'job', 'title', 'payment', 'name_id']

    def get(self, request):
        raws, sql_code = django_sql(self.sql, dict_keys=self.column_list, types='list_dict')
        return JsonResponse(data={'data': raws}, json_dumps_params={'ensure_ascii': False}, status=sql_code)

其中的django_sql是我自己封装的一个数据库查询模块,它会执行SQL,并将结果格式化成:列表包裹着字典的形式 [{}...],结果如下:

这里需要注意的是,json_dumps_params={'ensure_ascii': False} 这个参数,如果不关闭的话,它会将返回参数中的中文,转换成ascii码。


from django.core import serializers:

        serializers是django中自带的序列化方法,用法如下:

class TestViewDjango(View):

    def get(self, request):
        result = Vocation.objects.all()
        data = serializers.serialize('json', result, ensure_ascii=False)
        return HttpResponse(content=data, status=200)

serializers.serialize() 的必填参数有两个。其一是你需要序列化的格式,输入的是字符串,这里用的是json,此外还支持xml等格式的转换。其二是你需要转换的内容,必须是一个

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django序列化和反序列化是指将数据转换为特定格式以便传输或存储,并将特定格式的数据转换为模型对象的过程。 在开发REST API接口时,序列化和反序列化是非常重要的步骤。在视图,我们需要将数据库的数据序列化为前端所需要的格式,并返回给前端;同时,我们也需要将前端发送的数据反序列化为模型类对象,并保存到数据库。这样可以方便地处理数据的传输和存储。[1] 在Django REST framework,我们可以使用序列化来定义数据的序列化和反序列化过程。序列化是一个类,可以定义需要序列化和反序列化的字段。例如,我们可以定义一个BookInfoSerializer序列化,其包含需要序列化和反序列化的字段,如btitle、bpub_date和bread。[2] 在进行序列化时,如果要序列化的是包含多条数据的查询集QuerySet,可以通过添加many=True参数来说明。这样可以将查询集的每个对象序列化为特定格式的数据,并返回一个包含所有序列化对象的列表。[3] 总结起来,序列化和反序列化是在开发REST API接口时非常重要的步骤。通过序列化,我们可以将数据库的数据序列化为前端所需要的格式,并返回给前端;同时,我们也可以将前端发送的数据反序列化为模型类对象,并保存到数据库。这样可以方便地处理数据的传输和存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值