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 @ 2024-04-08 09:45  Xiao0101  阅读(57)  评论(0)    收藏  举报