rest_framework框架1(rest_framework框架----序列化)

序列化

1、创建一个序列化类

简单使用:

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

 

models.py部分

   

from django.db import models

# Create your models here.


# 书表
class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")
    price = models.IntegerField(verbose_name="价格")
    pub_date = models.DateField(verbose_name="出版时间")
    # 与出版社表关系为一对多关系
    publish = models.ForeignKey("Publish", verbose_name="出版社")
    # 与作者表为多对多关系
    authors = models.ManyToManyField("Author", verbose_name="作者")

    def __str__(self):
        return self.title


# 出版社表
class Publish(models.Model):
    name = models.CharField(max_length=32, verbose_name="出版社名称")
    email = models.EmailField(verbose_name="出版社邮箱")

    def __str__(self):
        return self.name


# 作者表
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")
    age = models.IntegerField(verbose_name="作者年龄")

    def __str__(self):
        return self.name

 

urls.py 部分

from django.conf.urls import url
from django.contrib import admin
from APP01 import views  # 关联应用APP01中的views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^publishes/', views.PublishView.as_view()),  # 添加路径(使用CBV方式)
]

序列化方法(views.py部分)

方法一(list强转)

from django.test import TestCase
from django.shortcuts import render, HttpResponse
from django.views import View
from .models import *
import json


# Create your tests here.

class PublishView(View):
    def get(self, request):
        publish_list = list(Publish.objects.all().values("name", "email"))  # list强转
        return HttpResponse(json.dumps(publish_list))

    def post(self, request):
        pass

方法二(与方法一类似)

from django.test import TestCase
from django.shortcuts import render, HttpResponse
from django.views import View
from .models import *
import json


# Create your tests here.
# 与方法一类似
class PublishView(View):
    def get(self, request):
        publish_list = Publish.objects.all()
        temp = []
        for publish in publish_list:
            temp.append({
                "name": publish.name,
                "email": publish.email
            })
        return HttpResponse(json.dumps(temp))

    def post(self, request):
        pass

方法三(model_to_dict:帮助序列化的一个方法)

from django.test import TestCase
from django.shortcuts import render, HttpResponse
from django.forms.models import model_to_dict
from django.views import View
from .models import *


# Create your tests here.
# model_to_dict:帮助序列化的一个方法
class PublishView(View):
    def get(self, request):
        publish_list = Publish.objects.all()
        temp = []
        for publish in publish_list:
            temp.append(model_to_dict(publish))  # 帮助序列化方法上比方式二
        return HttpResponse(temp)

    def post(self, request):
        pass

方法四(django中的serializers)

from django.shortcuts import render, HttpResponse
from django.views import View
from .models import *
from django.core import serializers


# Create your tests here.
# django中的serializers
class PublishView(View):
    def get(self, request):
        publish_list = Publish.objects.all()
        obj = serializers.serialize("json", publish_list)
        return HttpResponse(obj)

    def post(self, request):
        pass
# 结果
# [{"model": "APP01.publish", "pk": 1, "fields": {"name": "qqq", "email": "123@qq.com"}}, 
        # {"model": "APP01.publish", "pk": 2, "fields": {"name": "ttt", "email": "223@qq.com"}}]

方法五(使用rest_framework中的serializers进行序列化)

from django.shortcuts import render, HttpResponse
from django.views import View
from .models import *
from rest_framework import serializers


# Create your tests here.
# 类似from组件需要定义一个类
class PublishSerializers(serializers.Serializer):
    name = serializers.CharField()
    email = serializers.CharField()

# 使用rest_framework中的serializers进行序列化
class PublishView(View):
    def get(self, request):
        publish_list = Publish.objects.all()
        ret = PublishSerializers(publish_list, many=True)  # 如果是QuerySet类型的数据需要加many=True默认为False
        obj = ret.data
        return HttpResponse(obj)

    def post(self, request):
        pass
    # 结果
    # OrderedDict([('name', 'qqq'), ('email', '123@qq.com')])
    # OrderedDict([('name', 'ttt'), ('email', '223@qq.com')])

ModelSerializer

class BookSerializers(serializers.ModelSerializer):
      class Meta:
          model=Book
          fields="__all__"
          depth=1

提交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)
复制代码

重写save中的create方法

复制代码
class BookSerializers(serializers.ModelSerializer):

      class Meta:
          model=Book
          fields="__all__"
          # exclude = ['authors',]
          # depth=1

      def create(self, validated_data):
        
          authors = validated_data.pop('authors')
          obj = Book.objects.create(**validated_data)
          obj.authors.add(*authors)
          return obj
复制代码

 单条数据的get和put请求

复制代码
class BookDetailViewSet(APIView):

    def get(self,request,pk):
        book_obj=Book.objects.filter(pk=pk).first()
        bs=BookSerializers(book_obj)
        return Response(bs.data)

    def put(self,request,pk):
        book_obj=Book.objects.filter(pk=pk).first()
        bs=BookSerializers(book_obj,data=request.data)
        if bs.is_valid():
            bs.save()
            return Response(bs.data)
        else:
            return HttpResponse(bs.errors)
复制代码

超链接API:Hyperlinked

复制代码
class BookSerializers(serializers.ModelSerializer):
      publish= serializers.HyperlinkedIdentityField(
view_name='publish_detail',
lookup_field="publish_id",
lookup_url_kwarg="pk") class Meta: model=Book fields="__all__" #depth=1
复制代码

urls部分:

1
2
3
4
5
6
urlpatterns = [
    url(r'^books/$', views.BookViewSet.as_view(),name="book_list"),
    url(r'^books/(?P<pk>\d+)$', views.BookDetailViewSet.as_view(),name="book_detail"),
    url(r'^publishers/$', views.PublishViewSet.as_view(),name="publish_list"),
    url(r'^publishers/(?P<pk>\d+)$', views.PublishDetailViewSet.as_view(),name="publish_detail"),
]

 

posted @ 2018-05-18 08:38  争-渡  阅读(99)  评论(0)    收藏  举报