Django框架之序列化组件

一、为什么要序列化呢?

我们在写一些项目前后端是分离的,这意味着无法直接利用django提供的模版语法来实现前后端的数据交互,需要将数据转换成前后端都能接收处理的格式,即json,一般的格式都是列表套字典。

那么我的前端想拿到由ORM得到的数据库里面的一个个用户对象,而我的后端也想直接将实例化出来的数据对象直接发送给客户端,该怎么办呢?

那么这个时候,就可以用Django给我们提供的序列化方式。

二、如何序列化数据呢?

1、数据准备

需求:在前端获取后端用户表里面所有的数据,格式是列表套字典。

  • 创建模型表
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=32, verbose_name="姓名")
age = models.IntegerField(verbose_name="年龄")
gender_choices = (
(1, 'male'),
(2, 'female'),
(3, 'others')
)
gender = models.IntegerField(choices=gender_choices, verbose_name="性别")

2、基于JsonResponse序列化数据

  • 后端
def ab_ser(request):
user_queryset = models.User.objects.all()
user_list = []
for user_obj in user_queryset:
tmp = {
'pk': user_obj.pk,
'username': user_obj.username,
'age': user_obj.age,
'gender': user_obj.get_gender_display()
}
user_list.append(tmp)
return JsonResponse(user_list, safe=False)
# return render(request,'04 ab_ser.html',locals())
  • 前端
<body>
{% for user_obj in user_queryset %}
<p>{{ user_obj.name }}</p>
{% endfor %}
</body>
  • 前端接收到的数据展示
[
{"pk": 1, "username": "xiao", "age": 18, "gender": "male"},
{"pk": 2, "username": "quan", "age": 34, "gender": "female"},
{"pk": 3, "username": "zheng", "age": 33, "gender": "others"},
{"pk": 4, "username": "xu", "age": 23, "gender": 4}
]

如果是前后端分离的项目,作为后端开发,只需要写代码将数据处理好,能够序列化返回给前端即可

在写一个接口文档,告诉前端每个字段代表的意思即可

写接口就是利用序列化组件渲染数据然后写一个接口文档,该交代交待,最后完事

3、基于Django自带的serializers组件

import json
from django.http import JsonResponse
from django.core import serializers
def ab_ser(request):
user_queryset = models.User.objects.all()
# 序列化
res = serializers.serialize('json',user_queryset)
"""会自动帮你将数据变成json格式的字符串,并且内部非常的全面"""
return HttpResponse(res)
  • 前端返回的到的数据
[
{ "model": "app01.user",
"pk": 1,
"fields": {"username": "xiao", "age": 18, "gender": 1}},
{ "model": "app01.user",
"pk": 2,
"fields": {"username": "quan", "age": 34, "gender": 2}},
{ "model": "app01.user",
"pk": 3,
"fields": {"username": "zheng", "age": 33, "gender": 3}},
{ "model": "app01.user",
"pk": 4,
"fields": {"username": "xu", "age": 23, "gender": 4}}
]

三、补充

在Django中,序列化组件是一种强大的工具,用于将Django模型实例转换为其他数据格式(如JSON)或将其他数据格式转换为Django模型实例。这对于构建RESTful API和处理数据交换非常有用。下面是一个更详细的介绍以及示例代码:

1、 序列化数据

(1)使用django.core.serializers.serialize()函数

from django.core.serializers import serialize
from myapp.models import MyModel
# 将MyModel模型实例序列化为JSON格式
data = serialize('json', MyModel.objects.all())

(2)使用Django REST framework

from rest_framework import serializers
from myapp.models import MyModel
# 定义序列化器类
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = '__all__'
# 序列化模型实例
serializer = MyModelSerializer(instance=my_model_instance)
data = serializer.data

2、 反序列化数据

(1)使用django.core.serializers.deserialize()函数

from django.core.serializers import deserialize
from io import BytesIO
# 反序列化JSON数据为Django模型实例
json_data = '[{"model": "myapp.mymodel", "pk": 1, "fields": {"field1": "value1"}}]'
data = BytesIO(json_data.encode('utf-8'))
for obj in deserialize('json', data):
obj.save()

(2)使用Django REST framework

from rest_framework import serializers
from myapp.models import MyModel
# 定义反序列化器类
class MyModelDeserializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = '__all__'
# 反序列化数据
serializer = MyModelDeserializer(data=request.data)
if serializer.is_valid():
serializer.save()

3、 定制序列化输出

(1)使用Django REST framework的序列化器类

from rest_framework import serializers
from myapp.models import MyModel
class MyModelSerializer(serializers.ModelSerializer):
custom_field = serializers.SerializerMethodField()
def get_custom_field(self, obj):
return obj.field1 + ' - ' + obj.field2
class Meta:
model = MyModel
fields = ['field1', 'field2', 'custom_field']

这些示例展示了在Django中如何使用序列化组件来序列化和反序列化数据,以及如何定制序列化输出。通过这些工具,开发人员可以更灵活地处理数据,并在Django应用程序中实现数据交换和通信。

posted @   Xiao0101  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示

目录