序列化与restframework初识

概述

FBV和CBV的概念

FBV   基于函数处理视图
CBV    基于对象处理视图

CBV的优点

1  提高代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
2  可以用不同的函数针对不同的HTTP方法处理,而不是通过多if判断,提高代码的可读性

restful协议

一切皆是资源,操作只是请求方式

  1. REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”;
  2. REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态;
  3. 对于所有的数据,不论是通过网络获取的的数据,还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性;
  4. 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)

restframework

Django REST框架是一个功能强大且灵活的工具包,用于构建Web API。

安装restframework

cmd --> pip install djangorestframework

序列化的三种方式

方式一

自己手动序列化

publish_list = list(Publish.objects.all().values("name", "email"))
return HTTPResponse(json.dumps(publish_list))

方式二

自己动手序列化

publish_list = Publish.objects.all()
temp = []
for obj in publish_list:
    temp.append({
        "name": obj.name,
        "email": obj.email,
    })
return HTTPResponse(json.dumps(temp))

通过模块序列化

from django.forms.models import model_to_dict
publish_list = Publish.objects.all()
temp = []
for obj in publish_list:
    temp.append(model_to_dict(obj))

return HTTPResponse(json.dumps(temp))

方式三

Django的序列化

from django.core import serializers
publish_list = Publish.objects.all()
ret = serializers.serialize("json", publish_list)    # json是格式,publish_list是要序列化的queryset
return HTTPResponse(ret)

restframework的序列化

基于serializers模块的序列化方式

from rest_framework.response import Response
from rest_framework import serializers
 
class PublisherSerializers(serializers.Serializer):
    # 为queryset对象和model对象做序列化
    name = serializers.CharField()
    email = serializers.CharField()

class BookSerializers(serializers.Serializer):
    title = serializers.CharField(max_length=32)
    price = serializers.IntegerField()
    pub_date = serializers.DateField()

    publish = serializers.CharField(source="publish.name")         # 一对多的序列化方式
    # authors = serializers.CharField(source="authors.all")     # 多对多的序列化方式
    authors = serializers.SerializerMethodField()               # 多对多的序列化方式(推荐,需要重写钩子函数)

    def get_authors(self, obj):
        """钩子函数"""
        temp = []
        for obj in obj.authors.all():
            temp.append(obj.name)
        return temp


class PublishView(APIView):

    def get(self, request):
        publish_list = Publish.objects.all()
        ps = PublisherModerSerializers(publish_list, many=True)        # queryset对象需要传many=True(model_obj对象不用传)
        return Response(ps.data)

    def post(self, request):
        print("post")
        print(request.data)
        return HttpResponse("ok")

基于ModelSerializer组件的序列化方式

class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = "__all__"
    
    # Hyperlinked 超链接API
    publish = serializers.HyperlinkedIdentityField(
        view_name="publish_detail",    # url别名
        lookup_field="publish_id",    # 循环中的字段
        lookup_url_kwarg="id",        # 分组名
    )
    
class BookView(APIView):
    # 解析器
    # parser_classes = [JSONParser, ]

    def get(self, request):
        book_list = Book.objects.all()
        bs = BookModelSerializer(book_list, many=True, context={'request': request})  # 序列化类里有超链接API是必须传context
        return Response(bs.data)
    
    def post(self, request):
        # post请求的数据(生成记录)
        bs = BookModelSerializer(data=request.data, context={'request': request})    # 序列化类里有超链接API是必须传context
        print(request.data)
        if bs.is_valid():    # ModelSerializer可以做校验
            print(bs.validated_data)
            bs.save()        # create方法
            return Response(bs.data)
        else:
            return Response(bs.errors)
                
class BookDetailView(APIView):

    def get(self, request, id):
        """查看具体的某个数据"""
        book = Book.objects.filter(pk=id).first()
        bs = BookModelSerializer(book, context={'request': request})
        return Response(bs.data)

    def put(self, request, id):
        """更新具体的某个数据"""
        book = Book.objects.filter(pk=id).first()
        bs = BookModelSerializer(book, data=request.data, context={'request': request})
        if bs.is_valid():
            # 校验通过
            bs.save()    # update方法
            return Response(bs.data)
        else:
            return Response(bs.errors)

    def delete(self, request, id):
        """删除具体的某本书籍"""
        Book.objects.filter(pk=id).delete()
        return Response()
原文地址:https://www.cnblogs.com/sunch/p/9993573.html