一 restframwork为我们提供了一个快速实例,方便我们快速理解restframwork的序列化的原理。

快速实例化

Django REST framework API 指南

二 restframwork序列化

开发我们的Web API(应用程序接口)的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。

1 首先创建一个序列化类

1 models部分:

from django.db import models

# Create your models here.

class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField()
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def __str__(self):
return self.title class Publish(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField()
def __str__(self):
return self.name class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name

2 view部分:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializers from rest_framework import serializers class BookSerializers(serializers.Serializer):
title=serializers.CharField(max_length=32)
price=serializers.IntegerField()
pub_date=serializers.DateField()
   ## 对于多对一的字段我们需要添加source=“publish.name” 从而取到我们对应模型类中的字段,而不是显示关联的id。
publish=serializers.CharField(source="publish.name")
#authors=serializers.CharField(source="authors.all") ### 那么对于多对多的字段我们需要自定义一个方法,来拿到对应模型类model中的所有字段,显示出来。
authors=serializers.SerializerMethodField()
def get_authors(self,obj): # 其中obj为当前模型类Book的对象。
temp=[]
for author in obj.authors.all():
temp.append(author.name) # 将author的名字添加到一个列表中。
return temp class BookViewSet(APIView): def get(self,request,*args,**kwargs):
book_list=Book.objects.all()
# 序列化方式1:使用django进行序列化操作。
# from django.forms.models import model_to_dict
# import json
# data=[]
# for obj in book_list:
# data.append(model_to_dict(obj))
# print(data)
# return HttpResponse("ok") # 序列化方式2: 继承serializers.Serialize进行自定制的序列化。
     # data=serializers.serialize("json",book_list) 
     # return HttpResponse(data)
    
# 序列化方式3: ModelSerializer序列化组件
# bs=BookSerializers(book_list,many=True) return Response(bs.data)
以上三种序列化的方式:
第一种使用的还是django的序列化方式。
第二,三种则是使用restframwork的方式,分别继承:serializers.Serializer和serializers.ModelSerializer

3 ModelSerializer:

class BookSerializers(serializers.ModelSerializer):
class Meta:
model=Book
fields="__all__"
      exclude=(‘nid’,)
depth=1

4 提交post的请求:

def post(self,request,*args,**kwargs):

        bs=BookSerializers(data=request.data,many=False)
if bs.is_valid():
# print(bs.validated_data)
bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors)

5 那么对于不同的请求条件不同,我们更新PUT的请求肯定与GET的请求是不用的url:

url:

urlpatterns = [
url(r'^admin/', admin.site.urls), url(r'^login/$', views.LoginView.as_view()),
url(r'^courses/$', views.CourseView.as_view()),
url(r'^publishes/$', views.PublishView.as_view()),
url(r'^books/$', views.BookView.as_view()),
url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()), url(r'^authors/$', views.AuthorView.as_view()),
url(r'^authors/(?P<pk>\d+)/$', views.AuthorDetailView.as_view()),
]

view.py

class AuthorView(APIView):
def get(self, request):
author_list = Author.objects.all() # 方式1: Django的序列化组件
# ret=serialize("json",publish_list)
# 方式2:rest的序列化
As = AuthorSerializers(author_list, many=True)
# 序列化数据 return Response(As.data) def post(self, request): # 添加一条数据
print(request.data) As = AuthorSerializers(data=request.data)
if As.is_valid():
As.save() # 生成记录
return Response(As.data)
else: return Response(As.errors) class AuthorDetailView(APIView):
def get(self, request, pk):
author_obj = Author.objects.filter(pk=pk).first()
As = AuthorSerializers(author_obj, many=False) return Response(As.data) def put(self, request, pk):
author_obj = Author.objects.filter(pk=pk).first() As = AuthorSerializers(data=request.data, instance=author_obj)
if As.is_valid():
As.save() # update
return Response(As.data)
else:
return Response(As.errors) def delete(self, request, pk):
Author.objects.filter(pk=pk).delete() return Response("")

最新文章

  1. 数据库设计(2/9):域,约束和默认值(Domains, Constraints and Defaults)
  2. no-jquery 01Elements
  3. &lt;input type=&quot;file&quot;&gt;中怎设置那个按钮的样式
  4. 配置ssh免密码连接
  5. POJ 1469 COURSES(二部图匹配)
  6. 如何使用C#和VB发送和接收MSMQ消息
  7. 总结:ARM逻辑和高级C(朱老师物联网学习)
  8. poj2636---Electrical Outlets(插线板)
  9. 让gdb能打印C++中的容器类型
  10. 【java学习笔记】正则表达式
  11. &#39;gbk&#39; codec can&#39;t encode character解决方法
  12. matlab练习程序(波纹扭曲)
  13. C++ vector和list的主要用法区别
  14. DW表格的简单应用 之(个人简历模板)
  15. 57.纯 CSS 创作一双黑暗中的眼睛
  16. linux下安装rar以及rar相关命令参数详解
  17. 【C++】深度探索C++对象模型读书笔记--执行期语意学(Runtime Semantics)
  18. easyui前后台转义字符和普通字符的相互转换问题
  19. JavaScript数据类型转换汇总
  20. python开发进程:互斥锁(同步锁)&amp;进程其他属性&amp;进程间通信(queue)&amp;生产者消费者模型

热门文章

  1. docker for mac 安装 kubernetes、kubernetes dashboard
  2. Shell 一键安装命令
  3. Jenkins 安装启动提示“iJob for jenkins.service failed because the control process exited with error code. See &quot;systemctl status jenkins.service&quot; and &quot;journalctl -xe&quot; for details.”
  4. python编码encode decode(解惑)
  5. PageBaseType属性的功用
  6. C#语法中一个问号(?)和两个问号(??)的运算符
  7. delphi内存映射 与 映射数据获取
  8. 【亲测可用,亦可配置同一平台的不同账号,例如阿里云的两个不同账号】Windows下Git多账号配置,同一电脑多个ssh-key的管理
  9. selenium python选取下拉框中的值
  10. Hadoop错误集:Journal Storage Directory not formatted