前言
这几年一直在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