Django开发笔记(十一)--第二阶段! -- DRF序列化和反序列化
一.JsonResponse序列化
二.serializers序列化
三.DRF序列化
1.下载DRF包:
cmd窗口命令:
pip install djangorestframework
下载完成后可以使用pip list查看下载情况
2.在项目settings文件里配置restframework这个app,注册完就可以用它的一些工具:

2.在我们的项目下新建一个序列化文件serializers.py,在这个文件里自己写一个像model这样模型类一样的序列化类:
from rest_framework import serializers
class BookSerializers(serializers.Serializer):
id = serializers.IntegerField()
title = serializers.CharField(max_length=32)
CHOICES = ((1, 'Python'), (2, 'Go'), (3, 'Linux'))
# 这里和模型类定义有所不用了,多了一个source
category = serializers.ChoiceField(choices=CHOICES,source="get_category_display")
pub_time = serializers.DateField()

3.然后在views.py里使用这种方式进行序列化:
这里要注意,如果使用DRF框架,就要遵守人家的规则,
- view不用django.views import View了,要用 from rest_framework.views import APIView;
- 也不用HttpResponse了,要用from rest_framework.response import Response;
- 而且用我们自己写的序列化类来序列化我们的对象:from .serializers import BookSerializers
# from django.shortcuts import render
# from django.views import View
# from django.http import HttpResponse,JsonResponse
# from django.core import serializers
from .models import Book
# 如果使用DRF框架,就要遵守人家的规则,就不用django.views import View了
from rest_framework.views import APIView
from rest_framework.response import Response # 包括返回值也要继承人家的
from .serializers import BookSerializers # 用我们自己写的序列化类来序列化我们的对象
class BookView(APIView):
def get(self,request):
# book_obj = Book.objects.first()
# ret = BookSerializers(book_obj)
book_list = Book.objects.all()
ret = BookSerializers(book_list,many=True) # 拿出多个数据,需要一个many参数
return Response(ret.data) # 这里注意是放在ret.dat里的
4.如果想要对外键关系进行序列化,需要我们外键涉及到的其他表对应的序列化器也声明之后,才能进行序列化:
只需要在serializer类里做文章,views.py不用做任何改动:
from rest_framework import serializers
class PublisherSerializer(serializers.Serializer):
id = serializers.IntegerField()
title = serializers.CharField(max_length=32)
class AuthorSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField(max_length=32)
class BookSerializers(serializers.Serializer):
id = serializers.IntegerField()
title = serializers.CharField(max_length=32)
CHOICES = ((1, 'Python'), (2, 'Go'), (3, 'Linux'))
# 这里和模型类定义有所不用了,多了一个source
category = serializers.ChoiceField(choices=CHOICES,source="get_category_display")
pub_time = serializers.DateField()
publisher = PublisherSerializer()
author = AuthorSerializer(many=True) #这个many参数不要忘了
对咯,这个url.py:

最终效果:

四. DRF反序列化
序列化和反序列化要注意前端文档的字段,当我们遇到序列化和反序列化的字段不一样的时候,我们就要用read_only和write_only参数来区分他们。当有些字段前端无法传过来,比如id,那么我们就给这个字段设置required=False,表示不需要校验。
create的时候要注意取的是不是我们反序列化的数据。
views.py:
class BookView(APIView):
def get(self,request):
# book_obj = Book.objects.first()
# ret = BookSerializers(book_obj)
book_list = Book.objects.all()
ret = BookSerializers(book_list,many=True) # 拿出多个数据,需要一个many参数
return Response(ret.data) # 这里注意是放在ret.dat里的
def post(self,request):
print(request.data)
serializer = BookSerializers(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.validated_data)
else:
return Response(serializer.errors)
serializer.py:
class BookSerializers(serializers.Serializer):
id = serializers.IntegerField(required=False) # required = false就是不需要校验,那么在反序列化的时候就可以不传
title = serializers.CharField(max_length=32)
CHOICES = ((1, 'Python'), (2, 'Go'), (3, 'Linux'))
# 这里和模型类定义有所不用了,多了一个source
# read_only = True 就是说我只在序列化的时候用,前端展示的时候用,反序列化的时候用的是另一个w_category
category = serializers.ChoiceField(choices=CHOICES,source="get_category_display",read_only=True)
# write_only=True 意思是只反序列化的时候用,也就是说序列化的时候根本不会动这个字段,那前端传数据的时候就要约定传的是这个W_category了
w_category = serializers.ChoiceField(choices=CHOICES,write_only=True)
pub_time = serializers.DateField()
# 外键的反序列化 和上面的category处理方法一样
publisher = PublisherSerializer(read_only=True)
publisher_id = serializers.IntegerField(write_only=True)
author = AuthorSerializer(many=True,read_only=True) #这个many参数不要忘了
author_list = serializers.ListField(write_only=True)
def create(self,validate_data):
book = Book.objects.create(title = validate_data["title"],
category=validate_data["w_category"],
pubtime = validate_data["pub_time"],
publisher = validate_data["publisher_id"],
author = validate_data["author_list"])
return book
最终效果:

浙公网安备 33010602011771号