序列化類高級用法之source 使用source,欄位參數,可以修改序列化欄位名字 原本序列化器中欄位名,必須和表中的欄位名一樣,不一樣會報錯 我們可以通過source欄位來改變序列化器中的欄位名,使得前端在展示的時候也修改一下欄位名!! source也可以做跨表查詢,通過外鍵欄位,表名點外鍵出去的 ...
序列化類高級用法之source
使用source,欄位參數,可以修改序列化欄位名字
原本序列化器中欄位名,必須和表中的欄位名一樣,不一樣會報錯
我們可以通過source欄位來改變序列化器中的欄位名,使得前端在展示的時候也修改一下欄位名!!
source也可以做跨表查詢,通過外鍵欄位,表名點外鍵出去的欄位名字
class BookSerializer(serializers.Serializer):
publish=serializers.CharField(source='publish.email')
# 等價於book.publish.email 查到當前書對象的文鍵出版社對象然後拿到該出版社對象的郵箱
source指定的可以是欄位,也可以是方法,用於重命名
小坑:不能夠指定它原本的名字
序列化類高級用法之定製序列化欄位的倆種方式
方式一:在【序列化類】中寫SerializerMethodField
必須配合一個方法(get_欄位名,需要傳一個欄位名接受一個參數),方法返回什麼,這個欄位就是什麼
class BookSerializer(serializers.Serializer):
name = serializers.CharField(max_length=8, min_length=3)
price = serializers.IntegerField(max_value=300, min_value=10)
# publish = serializers.CharField(max_length=8, min_length=3)
# publish要序列化成{name:北京出版社,city:北京,email:[email protected]}
# 方式一:SerializerMethodField必須配合一個方法(get_欄位名,需要傳一個欄位名接受一個參數),方法返回什麼,這個欄位就是什麼
publish = serializers.SerializerMethodField()
def get_publish(self, obj):
# obj 就是當前序列化的對象
return {'name': obj.publish.name, 'city': obj.publish.city, 'email': obj.publish.email} # 基於對象的跨表查詢
# 練習一
author = serializers.SerializerMethodField()
def get_author(self, obj):
res_list = []
for author in obj.authors.all():
res_list.append({'id': author.id, 'name': author.name, 'age': author.age})
return res_list
assert斷言
# 框架的源碼中,大量使用斷言
# assert :斷言,作用的判斷,斷定一個變數必須是xx,如果不是就報錯
# 你的土鱉寫法
# name = 'lqz1'
# if not name == 'lqz':
# raise Exception('name不等於lqz')
#
# print('程式執行完了')
# assert的斷言寫法
name = 'lqz1'
assert name == 'lqz', 'name不等於lqz'
print('程式執行完了')