- 序列化
把Python中對象轉換為json格式字符串
- 反序列化
把json格式轉為為Python對象腋舌。
- 序列化兩大功能:
對請求數(shù)據(jù)進行驗證
對Queryset對象進行序列化
rest framework序列化之Serializer
- 建表 models.py
from django.db import models
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
- views
寫一個restframework接口拿到數(shù)據(jù)(所有圖書)
方式一:如果沒有序列化組件的話,要先轉成字典烤蜕,然后再用json.dumps()再轉卖子。
方式二:用序列化組件斩萌。
首先你要序列化誰玻褪,先寫一個類。這個類繼承一個東西房蝉,然后用的時候僚匆,在視圖類中直接用這個類生成一個對象。
from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from api import models
# 想用這個類搭幻,需要導入
from api.MySerializer import BookSerializer
class BookView(APIView):
def get(self,request,*args,**kwargs):
ret = {
'code':100,
'msg':'成功了'
}
books = models.Book.objects.all()
# 第一個參數(shù)是要序列化的對象咧擂,如果序列化多條,必須指定many=True
books_ser = BookSerializer(instance=books,many=True)
# 當序列化的對象是單個對象的時候many=False book = models.Book.objects.all().first()
# books_ser.data 就是序列化后的結果 是個字典
print(books_ser.data)
ret['books']=books_ser.data
# return Response(books_ser.data)
return Response(ret)
- 寫的格式化的類在另外的文件夾或文件:
# 自己寫一個序列化的類
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
# 序列化哪個字段,必須跟數(shù)據(jù)庫字段一樣檀蹋,都想序列化就一個一個排著寫
id = serializers.CharField()
title = serializers.CharField()
price = serializers.CharField()
ModelSerializer
'''
基于ModelSerializer的序列化器
'''
from rest_framework import serializers
from SerDemo.models import Book
class BookSerializer(serializers.ModelSerializer):
# SerializerMethodField() 方法字段松申,返回值是該字段方法的返回值
# SerializerMethodField() 一般用于正序列化
newcategory = serializers.SerializerMethodField(read_only=True)
newpublisher = serializers.SerializerMethodField(read_only=True)
newauthors = serializers.SerializerMethodField(read_only=True)
# 字段方法,必須有obj參數(shù),返回值給category_text字段
def get_newcategory(self,obj):
return obj.get_category_display()
# 外鍵關系的展示方法
def get_newpublisher(self,obj):
return {"id":obj.publisher_id,"title":obj.publisher.title}
# 多對多關系的展示方法
def get_newauthors(self,obj):
return [{"id":author.id,"name":author.name} for author in obj.authors.all()]
class Meta:
model = Book # 序列化的模型
fields = "__all__" # 序列化所有字段
# fields = ['id','title'] 序列化列表內的字段
# exclude = ['publisher','authors'] 序列化模型內排除列表內的字段
# depth = 1 根據(jù)外鍵關系往內找1層俯逾,但所有的外鍵都變成read_only = True
# 給原來的字段添加屬性
extra_kwargs = {
"category":{"write_only":True}, # 字段: {參數(shù):參數(shù)值}
"publisher":{"write_only":True},
"authors":{"write_only":True},
}
from utils.model_serializers import BookSerializer # 導入序列化組件
from .models import Book
from rest_framework.views import APIView
from rest_framework.response import Response
class BookView(APIView):
def get(self,request):
# 找到所有的模型對象
book_queryset = Book.objects.all()
# 對模型對象進行序列化贸桶,返回序列化對象
ser_obj = BookSerializer(book_queryset,many=True) # 多個模型對象使用many=True
return Response(ser_obj.data)
def post(self,request):
# 將前端獲取的數(shù)據(jù),返回序列化對象
ser_obj = BookSerializer(data=request.data)
# 對序列化對象進行校驗
if ser_obj.is_valid():
# 校驗通過桌肴,創(chuàng)建對象
ser_obj.save()
return Response(ser_obj.data) # 返回新增的對象
else:
return Response(ser_obj.errors) # 返回錯誤信息
# 帶id的查詢皇筛、更新、刪除
class EditBookView(APIView):
# 根據(jù)id查看數(shù)據(jù)
def get(self,request,id):
# 根據(jù)ip找到模型對象
book_obj = Book.objects.filter(pk=id).first()
# 對模型對象進行序列化识脆,返回序列化對象
ser_obj = BookSerializer(book_obj)
# 返回序列化對象的數(shù)據(jù)
return Response(ser_obj.data)
# 根據(jù)id更新數(shù)據(jù)
def put(self,request,id):
# 根據(jù)ip找到模型對象
book_obj = Book.objects.filter(pk=id).first()
# 將獲取的數(shù)據(jù)根據(jù)模型對象進行序列化设联,返回序列化對象
ser_obj = BookSerializer(instance=book_obj,data=request.data,partial=True)
# partial=True 部分匹配
# data=request.data 前端提交的數(shù)據(jù)
# instance=book_obj根據(jù)id找到的實例化對象
# 對實例化對象進行校驗
if ser_obj.is_valid():
# 校驗通過,調用save進行更新
ser_obj.save() # 內部調用序列化器的update方法
return Response(ser_obj.data)
else:
return Response(ser_obj.errors) # 返回錯誤信息
# 根據(jù)id刪除數(shù)據(jù)
def delete(self,request,id):
# 根據(jù)ip找到模型對象
book_obj = Book.objects.filter(pk=id).first()
if book_obj:
book_obj.delete()
return Response("刪除成功")
else:
return Response("刪除失敗")