Fork me on GitHub

restframwork之序列化

一 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("")
View Code

 

 

posted @ 2018-08-01 14:52  道阻切长  阅读(180)  评论(0编辑  收藏  举报