restframework之序列化

序列化

序列化用於對用戶請求數據進行驗證和數據進行序列化(爲了解決queryset序列化問題)。git

那什麼是序列化呢?序列化就是把對象轉換成字符串,反序列化就是把字符串轉換成對象ajax

Django 序列化django

serialze 只能作序列化json

from django.core.serializers import serialize瀏覽器

publish_list=Publish.objects.all()app

        #方式1: Django的序列化組件ide

        # ret=serialize("json",publish_list)post

 

咱們用postman 幫咱們提交數據url

 

restframework 序列化(不僅作序列化,能夠集成)spa

 

若是是瀏覽器就是看到這個頁面,若是是其餘ajax就顯示數據

 

 

具體代碼

一,#  自定義序列化組件

Serializers

from rest_framework import serializers #先把字段寫出來

class BookSerializers(serializers.Serializer): title=serializers.CharField() price=serializers.CharField() publishDate=serializers.DateField() # 針對一對多
 publish=serializers.CharField(source="publish.name") publish_email=serializers.CharField(source="publish.email") # 針對多對多
 authors=serializers.SerializerMethodField() def get_authors(self,obj): data=[] for i in obj.authors.all(): temp=[] temp.append(i.pk) temp.append(i.name) data.append(temp) return data class PublishSerializers(serializers.Serializer): """ PublishSerializers組件是一個集成功能組件,到底用什麼功能,取決於調用什麼接口 """ name=serializers.CharField()  # 普通字段
 city=serializers.CharField() # email=serializers.EmailField()

 

 

''' ps=PublishSerializers(publish_list,many=True) # 序列化數據 return Response(ps.data) 解析: data=[] for obj in publish_list: data.append({ "name":obj.name, "city":obj.city, "email":obj.email, "publish":obj.publish.email, # if 字段是多對多字段: "authors":get_authors(obj) }) self.data=data '''
View Code

view

from app01.models import *

from django.core.serializers import serialize from rest_framework.views import APIView from app01.serializers import PublishSerializers,BookSerializers,AuthorSerializers from rest_framework.response import Response  # 響應器

class PublishView(APIView): def get(self,request): publish_list=Publish.objects.all() #方式1: Django的序列化組件

        # ret=serialize("json",publish_list)

 

        # 方式2:rest的序列化
 ps=PublishSerializers(publish_list,many=True)# many=True:不單單是序列化queryset,還有model

        # 序列化數據

 

        return Response(ps.data) def post(self,request): pass

 

""" "books" GET:獲取全部數據 POST:添加一條數據 "book/1" GET:獲取單條數據 DELETE:刪除一條數據 PUT/PATCH:更新一條數據 """" 
class BookView(APIView): def get(self, request): book_list = Book.objects.all() # 方式1: Django的序列化組件

        # ret=serialize("json",publish_list)

        # 方式2:rest的序列化
 bs = BookSerializers(book_list, many=True)# many=True:不單單是序列化queryset,還有model

        # 序列化數據

 

        return Response(bs.data) def post(self, request): # 添加一條數據

        print(request.data) # 添加數據
 bs=BookSerializers(data=request.data) if bs.is_valid(): #校驗字段接口
 bs.save() # 生成記錄

            return Response(bs.data)# 序列化接口

        else: return Response(bs.errors) class BookDetailView(APIView): def get(self,request,pk): book_obj=Book.objects.filter(pk=pk).first() bs=BookSerializers(book_obj,many=False) return Response(bs.data) def put(self,request,pk): book_obj = Book.objects.filter(pk=pk).first() # 更新數據
 bs=BookSerializers(data=request.data,instance=book_obj) if bs.is_valid(): bs.save() # update

            return Response(bs.data) else: return Response(bs.errors) def delete(self,request,pk): Book.objects.filter(pk=pk).delete() return Response("")
View Code 

二, ModelSerializer  (不想寫字段,能夠直接繼承)序列化組件

from app01.models import *

class PublishSerializers(serializers.ModelSerializer): class Meta: model=Publish exclude=("nid",) from app01.models import *

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

 

    # publish = serializers.CharField(source="publish.name")

    # authors=serializers.SerializerMethodField()

    # def get_authors(self,obj):

    # data=[]

    # for i in obj.authors.all():

    # temp=[]

    # temp.append(i.pk)

    # temp.append(i.name)

    # data.append(temp)

    # return data

 

 

class AuthorSerializers(serializers.ModelSerializer): class Meta: model=Author fields="__all__"
View Code

 

Model 部分:

class Course(models.Model): title=models.CharField(max_length=32) from django.db import models # Create your models here.

 

 

class Author(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max_length=32) age=models.IntegerField() # 與AuthorDetail創建一對一的關係
 authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE) def __str__(self): return self.name class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True) birthday=models.DateField() telephone=models.BigIntegerField() addr=models.CharField( max_length=64) def __str__(self): return str(self.telephone) class Publish(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max_length=32) city=models.CharField( max_length=32) email=models.EmailField() def __str__(self): return self.name class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField( max_length=32) publishDate=models.DateField() price=models.DecimalField(max_digits=5,decimal_places=2) # 與Publish創建一對多的關係,外鍵字段創建在多的一方
 publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE) # 與Author表創建多對多的關係,ManyToManyField能夠建在兩個模型中的任意一個,自動建立第三張表
 authors=models.ManyToManyField(to='Author',) def __str__(self): return self.title 
View Code

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 Code
相關文章
相關標籤/搜索