-
一竖螃、restframework 序列化組件之
serializers
from rest_framework import serializers from rest_framework.response import Response from rest_framework.views import APIView from app01.models import Book class BookSerializer(serializers.Serializer): # 【自定義一個序列化類】 title = serializers.CharField(max_length=32) # 【寫哪些字段就序列化哪些】 price = serializers.DecimalField(max_digits=5, decimal_places=2) publish = serializers.CharField(max_length=32) # 一本書對應(yīng)一個出版社 publish_email = serializers.CharField(max_length=32, source='publish.email') # 一本書對應(yīng)一個出版社 publish_city = serializers.CharField(max_length=32, source='publish.city') # 一本書對應(yīng)一個出版社 # authors = serializers.CharField(max_length=32) # authors = serializers.CharField(max_length=32,source='authors.all') # "authors": "<QuerySet [<Author: 張三>, <Author: 王五>]>" authors = serializers.SerializerMethodField() def get_authors(self, obj): ret = [] # 這個數(shù)據(jù)類型可根據(jù)前端需求自己構(gòu)建 for i in obj.authors.all(): ret.append(i.name) return ret class BookView(APIView): def get(self, request): book_list = Book.objects.all() bs = BookSerializer(book_list, many=True) # 【序列化接口】 print(bs.data) # 【有序字典】 return Response(bs.data) def post(self,request): # 請求來了必須先校驗有效性啡邑,才能存入數(shù)據(jù)庫 bs =BookSerializer(data=request.data) print(request.data) # 【字典】 print(bs.is_valid()) # 不符合規(guī)范就是False if bs.is_valid(): # 【校驗】 Book.objects.create(**request.data) # 【存庫】 return Response(bs.data) # 【返回結(jié)果】 else: return Response(bs.errors) # 【返回錯誤信息】
這樣寫非常多,每一個字段都得自己寫,所以就引出了
ModelSerializer
,【見 三】 -
二评凝、序列化過程(GET請求)
bs = BookSerializer(book_list,many = True) bs.data temp = [] for obj in book_list: temp.append({ 'title':obj.title, 'price':obj.price, 'publish':obj.publish 【此時坯钦,取出來的是個對象,顯示的是此對象中__str__方法的返回值】 所以益咬,設(shè)置外鍵關(guān)聯(lián)的字段也能序列化出來逮诲。 }) 1,另外:加上source幽告,就會找source里面的梅鹦。可用到外鍵的關(guān)聯(lián)字段里冗锁,點出來一個對象之后再找出對象的屬性齐唆。 publish = serializers.CharField(max_length=32,source='publish.email') 2,所以:外鍵的關(guān)聯(lián)對象的任何字段都可以取出冻河。 publish_email = serializers.CharField(max_length=32,source='publish.email') publish_city = serializers.CharField(max_length=32,source='publish.city') 3箍邮,多對多字段這樣寫會形成這樣的數(shù)據(jù)類型: authors = serializers.CharField(max_length=32,source='authors.all') "authors": "<QuerySet [<Author: 張三>, <Author: 王五>]>" 4,所以:多對多字段可以這樣寫: authors = serializers,SerializerMethodField() def get_authors(self,obj): ret = [] for i in obj.authors.all() ret.append(i.name) return ret 5叨叙,序列化時锭弊,看見是SerializerMethodField類,就會執(zhí)行自定義的get_字段名的方法摔敛。即可解決多對多的顯示問題 if 字段SerializerMethodField: "authors":get_authors(obj)
-
三廷蓉、
ModelSerializer
的(get查看)和(post添加)from rest_framework import serializers from rest_framework.response import Response from rest_framework.views import APIView from app01.models import Book class BookSerializer(serializers.ModelSerializer): publish_name = serializers.CharField(max_length=32, source="publish.name", read_only=True) publish_city = serializers.CharField(max_length=32, source='publish.city',read_only=True) publish_pk=serializers.CharField(max_length=32,source="publish.pk",read_only=True) author_list = serializers.SerializerMethodField(read_only=True) # 【規(guī)定只讀】 def get_author_list(self, obj): ret = [] # 這個數(shù)據(jù)類型可根據(jù)前端需求自己構(gòu)建 for i in obj.authors.all(): ret.append({'name':i.name,'pk':i.pk}) return ret publish_info = serializers.SerializerMethodField(read_only=True) def get_publish_info(self, obj): return {"name": obj.publish.name, "publish_pk": obj.publish.pk,"publish_city":obj.publish.city} class Meta: model = Book # fields = ['title','price'] fields = '__all__' extra_kwargs = {"publish": {"write_only": True}, "authors": {"write_only": True}}#【規(guī)定只寫】 class BookView(APIView): def get(self, request): book_list = Book.objects.all() bs = BookSerializer(book_list, many=True) return Response(bs.data) def post(self, request): bs = BookSerializer(data=request.data, many=False) if bs.is_valid(): bs.save() # 【create操作,用ModelSerializer就可直接save】 return Response(bs.data) else: return Response(bs.errors)
DRF之序列化
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門就轧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人田度,你說我怎么就攤上這事妒御。” “怎么了镇饺?”我有些...
- 文/不壞的土叔 我叫張陵乎莉,是天一觀的道長。 經(jīng)常有香客問我奸笤,道長惋啃,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任监右,我火速辦了婚禮边灭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘健盒。我一直安慰自己绒瘦,他們只是感情好,可當我...
- 文/花漫 我一把揭開白布扣癣。 她就那樣靜靜地躺著椭坚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搏色。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼膳殷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了九火?” 一聲冷哼從身側(cè)響起赚窃,我...
- 正文 年R本政府宣布,位于F島的核電站扔嵌,受9級特大地震影響限府,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痢缎,卻給世界環(huán)境...
- 文/蒙蒙 一胁勺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧独旷,春花似錦署穗、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至麻养,卻和暖如春褐啡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鳖昌。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 寫在前面: 1. 定義創(chuàng)建序列化類( 子應(yīng)用中俐银,新建 serializers.py) 2. 設(shè)置 隱藏字段 獲取書...
- 什么是序列化序列化就是將對象轉(zhuǎn)化為字節(jié)流反序列化就是將字節(jié)流轉(zhuǎn)化為對象 序列化的作用1.將對象保存到磁盤上2.在網(wǎng)...
- 由于進行通信肯定要涉及數(shù)據(jù)的處理尿背,所以我們需要先了解兩個基礎(chǔ)的概念,序列化和反序列化悉患。 定義 序列化:將對象轉(zhuǎn)化為...