Django-Drf框架之序列化

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

序列化

什么是JSON

这一种在各个编程语言中流通的数据格式,可以在不同的编程语言中的进行数据传递交互

也就是用***JSON***传输数据可以让不同语言之间可以跨越语言不同的鸿沟,虽然 python 无法和 js 进行通信,但是通过***JSON***,就可以让两者进行数据通信,所以现在常见的接口返回的数据都是***JSON***格式

什么是序列化

序列化:就是把模型层的数据返回为JSON**数据集

反序列化:就是把前端发来的JSON**数据,类字典数据,变为模型层的数据

Json序列化

book_set = Book.objects.all()

books = []
for book in book_set:
    books.append({
    
    
        'id': book.id,
        'btitle': book.btitle,
        'price': book.price,
        'bread': book.bread,
        'bcomment': book.bcomment
    })

DRF序列化

drf中提供了类似django原生中forms组件的序列化类对象,通过对模型类或数据字段进行序列化字段映射

比如一个模型类表结构是这样的

class Book(models.Model):
    btitle = models.CharField(max_length=20, verbose_name="图书名称")
    price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name="单价")
    bread = models.IntegerField(verbose_name="阅读量")
    bcomment = models.IntegerField(verbose_name="评论量")
    img = models.ImageField(upload_to='imgs/%Y/%m/%d', verbose_name="封面图片")
   
    class Meta:
        db_table = 'tb_book'
        verbose_name = '图书'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.btitle

那么对应的,可以创建出如下所示的序列化器

class BookSerializer(serializers.Serializer):
    btitle = serializers.CharField(max_length=20, label='图书名称')
    price = serializers.DecimalField(max_digits=7, decimal_places=2, label='单价')
    bread = serializers.IntegerField(default=0, required=False, label='阅读量')
    bcomment = serializers.IntegerField(default=0, required=False, label='评论量')
    img = serializers.ImageField(label='封面图片', required=False)

这样可以更为方便的将orm遍历或拿取的单独数据进行序列化返回

books = Book.objects.all()

data = BookSerializer(books, many=True).data # 这就是经过序列化器处理好的 可以返回给前端的数据

序列化示例

一个获取所有图书的示例

from django.http.response import JsonResponse
from rest_framework.views import APIView

class BooksView(APIView):
    def get(self, request):
        books = Book.objects.all()  # 查询所有图书
        serializer = BookSerializer(books, many=True)  
        # 构建序列化器对象, 需要序列化的对象不止一个,需要参数 many=True
        return JsonResponse(serializer.data, safe=False)  
        # 需要转换为Json的数据不是字典,需要设置safe=False

猜你喜欢

转载自blog.csdn.net/HeroicLee/article/details/121529894