一、內部類
1、概念:將類定義在一個類的內部,被定義的類就是內部類
2、特點:內部類及內部類的所以名稱空間,可以直接被外部類訪問的
3、 應用:通過內部類的名稱空間,給外部類額外拓展一些特殊的屬性(配置),典型的Meta內部類 - 配置類
class Book(model.Model):
class Meta:
db_model = "owen_book"? ? ? ? ? ? ? ? # 配置自定義表名
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = "Book"? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 配置序列化類綁定的Model表
結果:
列子:特點:內部類及內部類的所以名稱空間,可以直接被外部類訪問的
二、DRF響應類:Response
1、源碼:
def __init__(self, data=None, status=None, template_name=None, headers=None, exception=False, content_type=None):
pass
2、源碼中的參數:
data:響應的數據 - 空、字符串、數字、列表、字段、布爾
status:網絡狀態碼
template_name:drf說自己也可以支持前后臺不分離返回頁面,但是不能和data共存(不會涉及)
headers:響應頭(不用刻意去管)
exception:是否是異常響應(如果是異常響應,可以賦值True,沒什么用)
content_type:響應的結果類型(如果是響應data,默認就是application/json,所有不用管)
3、常見使用
return Response(
data={
'status': 0,
'msg': 'ok',
'result': '正常數據'
}
)
return Response(
data={
'status': 1,
'msg': '客戶端錯誤提示',
},
status=status.HTTP_400_BAD_REQUEST,
exception=True
)
響應類源碼:最重要的是data和status
例子:設置網絡狀態碼
結果:
三、序列化基類(BaseSerializer)
1、源碼:
def __init__(self, instance=None, data=empty, **kwargs):
pass
2、源碼中的參數:
instance:是要被賦值對象的 - 對象類型數據賦值給instance
data:是要被賦值數據的 - 請求來的數據賦值給data
kwargs:內部有三個屬性:many、partial、context
many:操作的對象或數據,是單個的還是多個的
partial:在修改需求時使用,可以將所有校驗字段required校驗規則設置為False
context:用于視圖類和序列化類直接傳參使用
圖片:
3、 常見使用
# 單查接口
UserModelSerializer(instance=user_obj)
# 群查接口
UserModelSerializer(instance=user_query, many=True)
# 增接口
UserModelSerializer(data=request.data)
# 整體改接口
UserModelSerializer(instance=user_obj, data=request.data)
# 局部改接口
UserModelSerializer(instance=user_obj, data=request.data, partial=True)
# 刪接口,用不到序列化類
四、反序列化
1、views.py文件中
classUserAPIView(APIView):def post(self, request, *args, **kwargs):#單增
#1)將前臺請求的數據交給序列化類處理
#2)序列化類執行校驗方法,對前臺提交的所有數據進行數據校驗:校驗失敗就是異常返回,成功才能繼續
#3)序列化組件完成數據入庫操作,得到入庫對象
#4)響應結果給前臺
serializer = serializers.UserModelSerializer(data=request.data)ifserializer.is_valid():#校驗成功 => 入庫 => 正常響應
obj =serializer.save()returnResponse({'status': 0,'msg': 'ok','result': '新增的那個對象'}, status=status.HTTP_201_CREATED)else:#校驗失敗 => 異常響應
returnResponse({'status': 1,'msg': serializer.errors,
}, status=status.HTTP_400_BAD_REQUEST)
2、is_valid() 源碼:
斷言(assert): 其實就是等于? if...raise error
3、.save() 源碼:
4、提交post請求:
錯誤原因:
5、serializer 反序列化 分析:
第一波分析:
第二波分析
第三波 自定義反序列化字段
01、自定義只寫字段,在serializer類中聲明,必須手動明確write_only
02、自定義只讀字段,在model類中用@property聲明,默認就是read_only
6、全部、局部鉤子(用來篩選條件的)