四方显神

导航

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

最终效果:

 

posted on 2024-03-19 18:36  szdbjooo  阅读(22)  评论(0)    收藏  举报