目錄
1.反序列化
2.局部和全局鉤子
3.序列化類常用字段屬性
4.模型序列化全
5.請求對象(了解)
6.響應(yīng)對象屬性(了解)
7.回顧總結(jié)
1.反序列化
1 如果要反序列化,繼承了Serializer轧叽,必須重寫create方法
2 使用
#視圖類
def post(self, request):
publish_ser = serializer.PublishSerializer(data=request.data)
if publish_ser.is_valid():
# 直接保存为居,保存到哪個(gè)表里?需要重寫save
publish_ser.save()
return Response(publish_ser.data)
else:
return Response(publish_ser.error)
# 序列化類
def create(self, validated_data):
res = models.Publish.objects.create(**validated_data)
return res
2.局部和全局鉤子
def validate_name(self, data):
# data就是當(dāng)前字段的值
if data.startswith('sb'):
raise ValidationError('不能以sb開頭')
else:
return data
def validate(self, attrs):
if attrs.get('name') == attrs.get('city'):
raise ValidationError('city和名字不能一樣')
else:
return attrs
3.序列化類常用字段屬性
3.1 常用和非常用字段
http://www.liuqingzheng.top/python/Django-rest-framework%E6%A1%86%E6%9E%B6/2-drf-%E5%BA%8F%E5%88%97%E5%8C%96%E7%BB%84%E4%BB%B6/
3.2 字段參數(shù)
# 針對charfield
max_length 最大長度
min_lenght 最小長度
allow_blank 是否允許為空
# 針對interfield
max_value 最小值
min_value 最大值
# 通用的页慷,大家都有
#這兩個(gè)最重要
read_only 表明該字段僅用于序列化輸出憔足,默認(rèn)False(序列化)
write_only 表明該字段僅用于反序列化輸入胁附,默認(rèn)False(反序列化)
required 表明該字段在反序列化時(shí)必須輸入,默認(rèn)True
default 反序列化時(shí)使用的默認(rèn)值
allow_null 表明該字段是否允許傳入None滓彰,默認(rèn)False
error_messages 包含錯(cuò)誤編號與錯(cuò)誤信息的字典
validators 該字段使用的驗(yàn)證器(了解)
4.模型序列化全
4.1 視圖類
from rest_framework.views import APIView
from rest_framework.response import Response
from restful import models
from restful import serializer
class BookViews(APIView):
# 查詢所有
def get(self, request, *args, **kwargs):
response = {'status': 200, 'msg': '查詢'}
try:
# 取出數(shù)據(jù)庫所有
book_s = models.Book.objects.all()
# 序列化全部
books = serializer.BookModelSerializer(instance=book_s, many=True) # many全部
# book.data字典加入到data列表里
response['data'] = books.data
except Exception as e:
# 返回錯(cuò)誤信息
response['msg'] = str(e)
return Response(response)
# 增加
def post(self, request):
response = {'status': 200, 'msg': '新增'}
try:
# data反序列化
book_ser = serializer.BookModelSerializer(data=request.data)
# 校驗(yàn)
if book_ser.is_valid():
# 保存
book_ser.save()
# book.data字典加入到data列表里
response['data'] = book_ser.data
else:
# book.error錯(cuò)誤信息加入到msg列表里
response['msg'] = book_ser.errors
except Exception as e:
# 返回錯(cuò)誤信息
response['msg'] = str(e)
return Response(response)
class BooksViewsId(APIView):
# 查詢一個(gè)
def get(self, request, id):
response = {'status': 200, 'msg': '查詢'}
try:
# 取出id
book_s = models.Book.objects.all().filter(pk=id).first()
# 序列化
book_k = serializer.BookModelSerializer(instance=book_s)
# book.data字典加入到data列表里
response['data'] = book_k.data
except Exception as e:
# 返回錯(cuò)誤信息
response['msg'] = str(e)
return Response(response)
# 修改數(shù)據(jù)
def put(self, request, id):
response = {'status': 200, 'msg': '修改'}
try:
# 取出id
books_list = models.Book.objects.all().filter(pk=id).first()
# 拿到id號反序列化
book_ser = serializer.BookModelSerializer(instance=books_list, data=request.data)
# 校驗(yàn)
if book_ser.is_valid():
# 保存
book_ser.save()
# book.data字典加入到data列表里
response['data'] = book_ser.data
else:
# book.error錯(cuò)誤信息加入到msg列表里
response['msg'] = book_ser.errors
except Exception as e:
# 返回錯(cuò)誤信息
response['msg'] = str(e)
return Response(response)
# 刪除
def delete(self, request, id):
# 查詢到id號
res = models.Book.objects.filter(pk=id).delete()
# 判斷第一個(gè)刪除
if res[0] > 0:
return Response('')
else:
return Response('刪除的不存在')
4.2 序列化類
from rest_framework import serializers
from restful import models
from rest_framework.exceptions import ValidationError
# 繼承ModelSerializer類
class BookModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
# __all__ 查詢所有
fields = '__all__'
# 字段限制
extra_kwargs = {
'name': {'max_length': 6, 'required': True},
'price': {'min_value': 0, 'required': True},
}
# 局部鉤子
def validate_name(self, data):
# data就是當(dāng)前字段的值
if data.startswith('sb'):
raise ValidationError('不能以sb開頭')
else:
return data
# 全局鉤子
def validate(self, attrs):
if attrs.get('name') == attrs.get('price'):
raise ValidationError('名字一樣')
else:
return attrs
# 重寫字段
publish = serializers.SerializerMethodField()
# 字段詳情控妻,必須加get_字段名方法
def get_publish(self, obj):
return {'name': obj.publish.name, 'city': obj.publish.city}
# 重寫字段
authors = serializers.SerializerMethodField()
# 字段詳情,必須加get_字段名方法
def get_authors(self, obj):
return [{'name': author.name, 'age': author.age} for author in obj.authors.all()]
4.3 路由
from restful import views
urlpatterns = [
path('books/<int:id>/', views.BooksViewsId.as_view()),
path('booka/', views.BookViews.as_view()),
]
4.4 settings配置app(注意記得配置數(shù)據(jù)庫也可以用自帶sqllite3)
INSTALLED_APPS = [
'rest_framework'
]
4.5 models 表(注意遷移)
from django.db import models
class Book(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_date = models.DateField()
publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE)
authors = models.ManyToManyField(to='Author')
def __str__(self):
return self.name
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDatail', to_field='nid', unique=True, on_delete=models.CASCADE)
def __str__(self):
return self.name
class AuthorDatail(models.Model):
nid = models.AutoField(primary_key=True)
telephone = models.BigIntegerField()
birthday = models.DateField()
addr = models.CharField(max_length=64)
def __str__(self):
return self.addr
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
4.6 admin 配置(注意創(chuàng)建用戶 createsuperuser)
from django.contrib import admin
from restful import models
admin.site.register(models.Book)
admin.site.register(models.Author)
admin.site.register(models.AuthorDatail)
admin.site.register(models.Publish)
5.請求對象(了解)
1 Request:新的request
2 常用屬性
1).data
request.data 返回解析之后的請求體數(shù)據(jù)揭绑。類似于Django中標(biāo)準(zhǔn)的request.POST和 request.FILES屬性弓候,但提供如下特性:
包含了解析之后的文件和非文件數(shù)據(jù)
包含了對POST、PUT他匪、PATCH請求方式解析后的數(shù)據(jù)
利用了REST framework的parsers解析器菇存,不僅支持表單類型數(shù)據(jù),也支持JSON數(shù)據(jù)
2).query_params
request.query_params與Django標(biāo)準(zhǔn)的request.GET相同邦蜜,只是更換了更正確的名稱而已
6.響應(yīng)對象屬性(了解)
#一直會(huì)用
data: 為響應(yīng)準(zhǔn)備的序列化處理后的數(shù)據(jù)(字典)
#偶爾會(huì)用
headers: 用于存放響應(yīng)頭信息的字典依鸥;
status: 狀態(tài)碼,默認(rèn)200悼沈;(http請求的狀態(tài)碼)
# 基本不用
template_name: 模板名稱贱迟,如果使用HTMLRenderer 時(shí)需指明姐扮;
content_type: 響應(yīng)數(shù)據(jù)的Content-Type,通常此參數(shù)無需傳遞衣吠,REST framework會(huì)根據(jù)前端所需類型數(shù)據(jù)來設(shè)置該參數(shù)茶敏。
7.回顧總結(jié)
0 drf是django的一個(gè)app
-序列化器
-Request
-Response
-版本控制
-認(rèn)證,頻率缚俏,權(quán)限
-過濾惊搏,排序,分頁
-視圖相關(guān)
-自動(dòng)生成接口文檔(coreapi袍榆,swagger)
-jwt做認(rèn)證(第三方)
-xadmin---》對admin的美化(bootstrap+jq胀屿,1.x版本),simple-ui
-RBAC:基于角色的訪問控制(公司內(nèi)部項(xiàng)目)
1 序列化器
1. 序列化,序列化器會(huì)把模型對象轉(zhuǎn)換成字典,經(jīng)過response以后變成json字符串
2. 反序列化,把客戶端發(fā)送過來的數(shù)據(jù),經(jīng)過request以后變成字典,序列化器可以把字典轉(zhuǎn)成模型
3. 反序列化,完成數(shù)據(jù)校驗(yàn)功能
2 Serializer
-序列化
-實(shí)例化序列化對象包雀,many參數(shù)作用
-source
-SerializerMethodField
-模型表中寫方法
-反序列化
-ser=BookSerializer(data=request.data)
-數(shù)據(jù)校驗(yàn):ser.is_valid()
-存數(shù)據(jù):手動(dòng)存宿崭,重寫B(tài)ookSerializer的create方法,update方法
-ser.save() 如果是新增才写,會(huì)調(diào)用create葡兑,如果是修改,會(huì)調(diào)用update
-ser.data 如果有instance對象赞草,就是對instance做序列化
-全局讹堤,局部鉤子,字段參數(shù)
3 ModelSerializer
-class Meta:
model=Book
fields=‘__all__’
extra_kwargs
-重寫某個(gè)字段:跟之前學(xué)的又一樣了
-子序列化
4 常用非常用字段
5 字段參數(shù)
6 如果第三張表是手動(dòng)建的厨疙,authors是存不進(jìn)去的
{
name:ddd
price:10
publish:1
authors:[1,2]
}
7 請求對象的屬性
8 響應(yīng)對象
-data:響應(yīng)數(shù)據(jù)
-status:響應(yīng)狀態(tài)碼
-header:響應(yīng)頭
-content_type:響應(yīng)類型
9 加入serializer后整個(gè)后端邏輯