場(chǎng)景描述:
以前用序列化做比較簡(jiǎn)單的傳遞需要展示的數(shù)據(jù)供填,現(xiàn)在需要在一個(gè)序列化里面嵌套另外一個(gè)序列化渣磷。試一下serializer更多的玩法
- 業(yè)務(wù)邏輯基本介紹:
房間與車位間一對(duì)多關(guān)系婿着,車位與房間存在外鍵關(guān)聯(lián),現(xiàn)在查詢房間醋界,需要將與房間關(guān)聯(lián)的車位的詳細(xì)信息一起返回前端
主要思路:
- 實(shí)現(xiàn)兩個(gè)兩個(gè)序列化祟身,一個(gè)主要序列化 room 信息,一個(gè)主要序列化 parking (車位)
- 先將初始的結(jié)果集傳遞進(jìn)serializer物独,然后通過(guò)SerializerMethod來(lái)實(shí)現(xiàn)嵌套序列化
主要矛盾:
在SerialzierMethod實(shí)現(xiàn)序列化的時(shí)候袜硫,怎么將相關(guān)的值傳遞進(jìn)來(lái).(舉例子,這里)
def get_parkings(self, obj):
# 想想obj是啥
park = Parking.objects.filter(room=obj.id)
return ParklingSer(park, many=True).data
def get_effective_time(self, obj):
date = obj.effective_time
return date.strftime("%Y-%m-%d")
這時(shí)候就有幾個(gè)地方捋清楚了:
class RoomPropertySer(serializers.ModelSerializer):
effective_time = serializers.SerializerMethodField()
parkings = serializers.SerializerMethodField()
is_expired = serializers.SerializerMethodField()
...
class Meta:
model = Room
fields = ('name', 'uuid', 'base_property_fee','base_elevator_fee',
'payment_of_last_time', 'effective_time', 'is_expired',
'property_fee_time_limit', 'parking_sever_fee_time_limit',
'parking_leasing_fee_time_limit', 'parkings')
- 這幾個(gè)地方的具體作用是了解serializer比較重要的地方
開(kāi)始分析
我會(huì)將我的想法以及打印出來(lái)的結(jié)果和大家一起分享...
第一部分:
回到第一部分的代碼中挡篓,obj是個(gè)啥婉陷?
打印出來(lái)看下:
<class 'community.models.Room'>
這樣就很好處理了,因?yàn)檐囄坏男畔⒐傺校枰ㄟ^(guò)房間的id來(lái)獲取秽澳,重新格式化時(shí)間輸出的格式也需要原本的時(shí)間數(shù)據(jù),代碼就是這么寫的
看起來(lái)很簡(jiǎn)單嗎戏羽,沒(méi)有更難的了嗎
當(dāng)然担神,以上是最簡(jiǎn)單的。主要原因是傳遞進(jìn)來(lái)的是一個(gè)對(duì)象始花,需要的數(shù)據(jù)obj都有了妄讯,想想如果傳遞進(jìn)來(lái)的是純的字典類型數(shù)據(jù)孩锡,情況會(huì)這樣?
這個(gè)下一節(jié)繼續(xù)...
擴(kuò)展:
- fields在這里是干嘛的
用來(lái)規(guī)定能傳遞出去亥贸,需要序列化的數(shù)據(jù)
而SerialzierMethod相當(dāng)于自定義了需要傳遞出去的字段躬窜,然后將它放進(jìn)fields里,就能傳遞出去了