REST framework中的serializers與Django的Form和ModelForm類非常像。我們提供了一個(gè)Serializer類,它為你提供了強(qiáng)大的通用方法來控制響應(yīng)的輸出,
以及一個(gè)ModelSerializer類,它為創(chuàng)建用于處理模型實(shí)例和查詢集的序列化程序提供了有用的快捷實(shí)現(xiàn)方式。
先從一個(gè)簡單的案例開始,在apiapp目錄下編輯models.py,以創(chuàng)建用戶個(gè)人信息model為例
# models.py
from django.db import models
# 作者:上海悠悠,QQ交流群:750815713
# Create your models here.
class UserPersonalInfo(models.Model):
'''用戶個(gè)人信息'''
name = models.CharField(max_length=10, verbose_name="昵稱") # 昵稱
sex_choices = (
(u'M', u'男'),
(u'F', u'女'),
)
sex = models.CharField(max_length=11,
choices=sex_choices,
verbose_name="性別",
)
age = models.IntegerField(verbose_name="年齡", default="", blank=True)
mail = models.EmailField(max_length=30, default="", blank=True)
create_time = models.DateField(auto_now=True, verbose_name="添加時(shí)間")
執(zhí)行 makemigrations 和migrate同步數(shù)據(jù)庫
python manage.py makemigrations
python manage.py migrate
Serializer是rest_framework中最簡單的序列化基類,封裝也是最低的。但是這個(gè)基類比較靈活,可以通過這個(gè)類來定制我們需要的序列化類。
實(shí)現(xiàn)這個(gè)類需要重寫兩個(gè)方法,create和update。
create方法對(duì)應(yīng)我們在使用API的時(shí)候通過POST來訪問的,因?yàn)橥ǔMㄟ^POST來傳遞我們需要新建實(shí)例的數(shù)據(jù)。
update方法對(duì)應(yīng)通過PUT/PATCH方法訪問API,用來新建實(shí)例或者更新已存在的實(shí)例,這取決于數(shù)據(jù)庫是否存在我們需要操作的實(shí)例。
在apiapp目錄下新建一個(gè)serializersapi.py文件,在該文件先編輯需要序列化的model,id是系統(tǒng)默認(rèn)自帶的一個(gè)字段。
│ manage.py
├─apiapp
│ │ admin.py
│ │ apps.py
│ │ auth.py
│ │ models.py
│ │ serializersapi.py
│ │ tests.py
│ │ views.py
│ │ __init__.py
│ │
│ ├─migrations
│ │ │ 0001_initial.py
│ │ │ 0002_userpersonalinfo.py
│ │ │ __init__.py
│
└─yoyoapi
│ settings.py
│ urls.py
│ wsgi.py
│ __init__.py
在寫序列化類的時(shí)候,字段里面的相關(guān)參數(shù)verbose_name,blank得去掉。
# serializersapi.py
from rest_framework import serializers
from .models import UserPersonalInfo
class UserPersonalInfoSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(max_length=10) # 昵稱
sex_choices = (
(u'M', u'男'),
(u'F', u'女'),
)
sex = serializers.ChoiceField(choices=sex_choices
)
age = serializers.IntegerField(default="")
mail = serializers.EmailField(max_length=30, default="")
create_time = serializers.DateField(read_only=True)
def create(self,validated_data):
return UserPersonalInfo.objects.create(**validated_data)
def update(self,instance,validated_data):
instance.name=validated_data.get('name',instance.name)
instance.sex=validated_data.get('sex',instance.sex)
instance.age=validated_data.get('age',instance.age)
instance.mail=validated_data.get('mail',instance.mail)
instance.save()
return instance
在創(chuàng)建ArticleSerializer的時(shí)候,創(chuàng)建了一些字段,這些字段代表Serializer類在序列化的時(shí)候和model對(duì)應(yīng)的字段。這些字段應(yīng)該和model里定義的字段同名。
在定義的時(shí)候,指定了一些參數(shù),這里只用了read_only,還有其它的參數(shù)
write_only,required,allow_null/allow_blank,label,help_text,style,error_messages
read_only:
表示該字段只能用于API的輸出,用戶并不能直接指定該字段的值
write_only:
這個(gè)就和read_only相反,需要用戶指定該字段的值
required:
該字段是必需的,不能為空
allow_null/allow_blank:
該字段允許為null/空
label:
標(biāo)簽,用于對(duì)字段顯示設(shè)置
help_text:
對(duì)字段進(jìn)行解釋的一段文本,用于提示
style:
說明字段的類型
error_messages:
字段出錯(cuò)時(shí),信息提示
update方法中instancece參數(shù)是一個(gè)model實(shí)例,也可以是一個(gè)自定義類實(shí)例,其實(shí)model也就是一個(gè)類,只是在底層封裝了一些ORM操作。
views.py編輯以下內(nèi)容
# views.py
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import *
from rest_framework.permissions import IsAuthenticated,AllowAny
from .serializersapi import UserPersonalInfoSerializer
# 作者:上海悠悠,QQ交流群:750815713
class UserPersonalInfoView(APIView):
'''REST framework的APIView實(shí)現(xiàn)獲取UserPersonalInfo表 # 作者:上海悠悠,QQ交流群:750815713'''
# authentication_classes = (TokenAuthentication,) # token認(rèn)證
# permission_classes = (IsAuthenticated,) # IsAuthenticated 僅通過認(rèn)證的用戶
permission_classes = (AllowAny,) # 允許所有用戶
def get(self, request, format=None):
"""
Return a list of all UserPersonalInfo
"""
info = UserPersonalInfo.objects.all()
serializer = UserPersonalInfoSerializer(info, many=True)
return Response(serializer.data)
def post(self, request, format=None):
'''
create UserPersonalInfo
'''
verify_data = UserPersonalInfoSerializer(data=request.data)
if verify_data.is_valid():
verify_data.save()
return Response({"message": "create some data!", "data": request.data})
else:
return Response(verify_data.errors)
urls.py設(shè)置訪問路徑
# urls.py
from apiapp import views
from django.conf.urls import url
# 作者:上海悠悠,QQ交流群:750815713
urlpatterns = [
url(r'^userinfo', views.UserPersonalInfoView.as_view()),
]
訪問’http://127.0.0.1:8000/userinfo',post請(qǐng)求測試結(jié)果
POST http://127.0.0.1:8000/userinfo HTTP/1.1
User-Agent: Fiddler
Host: 127.0.0.1:8000
Content-Length: 82
Content-Type: application/json
{
"name": "yoyo",
"sex": "M",
"age": "20",
"mail": "283340479@qq.com"
}
新增成功,查看數(shù)據(jù)庫,會(huì)生成一條數(shù)據(jù)
訪問’http://127.0.0.1:8000/userinfo',get請(qǐng)求測試結(jié)果
聯(lián)系客服