一 restframwork为我们提供了一个快速实例,方便我们快速理解restframwork的序列化的原理。
二 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("")