1.解释器组件源码分析
https://www.processon.com/view/link/5ba0a8e7e4b0534c9be0c968
2.基于CBV的接口设计
1)、django循环queryset对象构造数组套字典方式
2)、django.serializers.serialize方式
3)、restframework序列化组件方式
###################### 基于CBV的接口设计####################### # class CourseView(View):
#
# def get(self,request):
#
# course_list=Course.objects.all()
# ret=[]
# for course in course_list:
# ret.append({
# "title":course.title,
# "desc":course.desc,
# })
#
#
# return HttpResponse(json.dumps(ret,ensure_ascii=False)) ###################### 基于DRF的接口设计####################### # from rest_framework.views import APIView
# from rest_framework.response import Response
# from rest_framework.parsers import JSONParser,FormParser,FileUploadParser
# from app01.models import Course
# #
#
# from rest_framework import serializers
# class CourseSerializer(serializers.Serializer):
# title=serializers.CharField(max_length=32)
# desc=serializers.CharField(max_length=32)
#
#
# class CourseView(APIView):
#
# def get(self,request):
# '''
# 查看所有数据
# 方式1:
# ret=[]
# for course in course_list:
# ret.append({
# "title":course.title,
# "desc":course.desc,
# })
#
# json.dumps(ret,ensure_ascii=False)
#
# 方式2:
# from django.core.serializers import serialize # Django的序列化组件
# data=serialize("json",course_list)
# print("data",data)
#
# 方式3:
# restframework序列化组件
# :param request:
# :return:
# '''
#
# course_list=Course.objects.all()
#
# cs=CourseSerializer(course_list,many=True)
# print("====>",cs.data) # 序列化接口
#
# '''
#
# [OrderedDict([('title', 'python'), ('desc', 'python非常好')]), OrderedDict([('title', 'linux'), ('desc', 'linux好')]), OrderedDict([('title', 'go'), ('desc', 'gogogo')])]
#
# '''
#
# return Response(cs.data)
#
#
# def post(self,request):
#
# print(request.data) # 静态方法:解析数据工作
# cs=CourseSerializer(data=request.data)
# if cs.is_valid(): # 校验
#
# # Course.objects.create(**request.data)
#
# return Response(cs.data) # 序列化数据
# else:
# return Response(cs.errors) # 序列化错误信息
# ##########################################################################
基于CBV的接口设计
3.restframework序列化组件
1.serializers.Serializer
class BookSerializer(serializers.Serializer):
title = serializers.CharField()
price = serializers.IntegerField()
# publish_email = serializers.CharField(source='publish.email')
# publish_name = serializers.CharField(source='publish.name')
publish = serializers.CharField(source='publish.nid')
authors = serializers.SerializerMethodField() def get_authors(self, obj):
data = []
print(obj.authors.all())
for i in obj.authors.all():
temp = []
temp.append(i.name)
temp.append(i.email)
data.append(temp)
return data
2.serializers.ModelSerializer
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = "__all__"
# exclude = ["publish"] # publish = serializers.CharField(source='publish.nid')
# authors = serializers.SerializerMethodField()
#
# def get_authors(self, obj):
# data = []
# print(obj.authors.all())
# for i in obj.authors.all():
# temp = []
# temp.append(i.name)
# temp.append(i.email)
# data.append(temp)
# return data class BookView(APIView):
# parser_classes = [FormParser, JSONParser, MultiPartParser] def get(self, request):
book_list = Book.objects.all()
bs = BookSerializer(book_list, many=True)
return response.Response(bs.data) def post(self, request):
serializer = BookSerializer(data=request.data) if serializer.is_valid(): serializer.save()
print(serializer.data) # 必须在save()方法之后
# {'id': 8, 'title': '第10本书', 'price': 12, 'publish': 1, 'authors': [1, 3]}
print(serializer.validated_data)
# OrderedDict([('title', '第10本书'), ('price', 12), ('publish', < Publish: 沙河出版社 >),
# ('authors', [ < Author: 下马哥 >, < Author: eva >])])
return response.Response(serializer.data)
else:
return response.Response(serializer.errors)