Django Rest Framework 序列化關(guān)系模型

這兩天一直在學(xué)習(xí) Django Rest Framework 這個(gè)框架,這是一個(gè)非常流行的 REST API 框架宰衙,深度整合 Django幅狮。但與傳統(tǒng) MVC 模式的不同, Django REST Framework 在使用過(guò)程中寞宫,需要理解一些新的東西萧福。結(jié)合官方 API 分享一下框架中關(guān)于序列化關(guān)系模型的理解。

序列化模型與序列化關(guān)系模型

序列化模型辈赋,顧名思義统锤,即對(duì) models 里的數(shù)據(jù)模型作序列化。而序列化關(guān)系模型則是對(duì) models 里數(shù)據(jù)模型中帶有關(guān)系的如 ForeignKey, ManyToManyFieldOneToOneField 字段作序列化炭庙。Django Rest Framework 提供了靈活的序列化關(guān)系模型饲窿,讓開(kāi)發(fā)者可以自由定制序列化數(shù)據(jù)模型。

序列化關(guān)系模型

根據(jù)官方的例子來(lái)看一下每一個(gè)關(guān)系模型的介紹焕蹄。

數(shù)據(jù)模型如下:

class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)

class Track(models.Model):
    album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
    order = models.IntegerField()
    title = models.CharField(max_length=100)
    duration = models.IntegerField()

    class Meta:
        unique_together = ('album', 'order')
        ordering = ['order']

    def __unicode__(self):
        return '%d: %s' % (self.order, self.title)

StringRelatedField

使用 StringRelatedField 將返回一個(gè)對(duì)應(yīng)關(guān)系 model 的 __unicode__() 方法的字符串逾雄。

這個(gè)字段是只讀的。

參數(shù):

  • many 如果應(yīng)用于多對(duì)多關(guān)系,則應(yīng)將此參數(shù)設(shè)置為 True

序列化模型如下

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.StringRelatedField(many=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

序列化結(jié)果如下:

{
    'album_name': 'Things We Lost In The Fire',
    'artist': 'Low',
    'tracks': [
        '1: Sunflower',
        '2: Whitetail',
        '3: Dinosaur Act',
        ...
    ]
}

PrimaryKeyRelatedField

使用 PrimaryKeyRelatedField 將返回一個(gè)對(duì)應(yīng)關(guān)系 model 的主鍵鸦泳。

參數(shù):

  • queryset 用于在驗(yàn)證字段輸入時(shí)模型實(shí)例查找银锻。 關(guān)系必須明確設(shè)置 queryset,或設(shè)置 read_only = True
  • many 如果是對(duì)應(yīng)多個(gè)的關(guān)系做鹰,就設(shè)置為 True
  • allow_null 如果設(shè)置為 True击纬,則該字段將接受 None 的值或?yàn)榭盏年P(guān)系的空字符串。默認(rèn)為 False
  • pk_field 設(shè)置為一個(gè)字段以控制主鍵值的序列化/反序列化钾麸。例如更振,pk_field = UUIDField(format ='hex') 將UUID主鍵序列化為緊湊的十六進(jìn)制表示。

序列化模型如下

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

序列化結(jié)果如下:

{
    'album_name': 'Undun',
    'artist': 'The Roots',
    'tracks': [
        89,
        90,
        91,
        ...
    ]
}

HyperlinkedRelatedField

使用 HyperlinkedRelatedField 將返回一個(gè)超鏈接饭尝,該鏈接指向?qū)?yīng)關(guān)系 model 的詳細(xì)數(shù)據(jù)肯腕,view-name 是必選參數(shù),為對(duì)應(yīng)的視圖生成超鏈接钥平。

參數(shù):

  • view_name 用作關(guān)系目標(biāo)的視圖名稱实撒。如果使用的是標(biāo)準(zhǔn)路由器類,那么它的格式為 <modelname>-detail 的字符串
  • queryset 驗(yàn)證字段輸入時(shí)用于模型實(shí)例查詢的查詢器涉瘾。關(guān)系必須明確設(shè)置 queryset知态,或設(shè)置 read_only = True
  • many 如果應(yīng)用于多對(duì)多關(guān)系,則應(yīng)將此參數(shù)設(shè)置為 True
  • allow_null 如果設(shè)置為 True立叛,則該字段將接受 None 的值或?yàn)榭盏年P(guān)系的空字符串肴甸。默認(rèn)為 False
  • lookup_field 應(yīng)該用于查找的目標(biāo)上的字段。應(yīng)該對(duì)應(yīng)于引用視圖上的 URL 關(guān)鍵字參數(shù)囚巴。默認(rèn)值為 pk
  • lookup_url_kwarg 與查找字段對(duì)應(yīng)的 URL conf 中定義的關(guān)鍵字參數(shù)的名稱原在。默認(rèn)使用與 lookup_field 相同的值
  • format 如果使用 format 后綴,超鏈接字段將對(duì)目標(biāo)使用相同的 format 后綴彤叉,除非使用 format 參數(shù)進(jìn)行覆蓋庶柿。

序列化模型如下

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.HyperlinkedRelatedField(
        many=True,
        read_only=True,
        view_name='track-detail'
    )

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

序列化結(jié)果如下:

{
    'album_name': 'Graceland',
    'artist': 'Paul Simon',
    'tracks': [
        'http://www.example.com/api/tracks/45/',
        'http://www.example.com/api/tracks/46/',
        'http://www.example.com/api/tracks/47/',
        ...
    ]
}

SlugRelatedField

使用 SlugRelatedField 將返回一個(gè)指定對(duì)應(yīng)關(guān)系 model 中的字段,需要擦參數(shù) slug_field 中指定字段名稱秽浇。

參數(shù):

  • slug_field 應(yīng)該用于表示目標(biāo)的字段浮庐。這應(yīng)該是唯一標(biāo)識(shí)任何給定實(shí)例的字段。例如 username 柬焕。這是必選參數(shù)
  • queryset 驗(yàn)證字段輸入時(shí)用于模型實(shí)例查詢的查詢器审残。 關(guān)系必須明確設(shè)置 queryset,或設(shè)置 read_only = True
  • many 如果應(yīng)用于多對(duì)多關(guān)系斑举,則應(yīng)將此參數(shù)設(shè)置為 True
  • allow_null 如果設(shè)置為 True搅轿,則該字段將接受 None 的值或?yàn)榭盏年P(guān)系的空字符串。默認(rèn)為 False

序列化模型如下

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.SlugRelatedField(
        many=True,
        read_only=True,
        slug_field='title'
     )

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

序列化結(jié)果如下:

{
    'album_name': 'Dear John',
    'artist': 'Loney Dear',
    'tracks': [
        'Airport Surroundings',
        'Everything Turns to You',
        'I Was Only Going Out',
        ...
    ]
}

HyperlinkedIdentityField

使用 HyperlinkedIdentityField 將返回指定 view-name 的超鏈接的字段富玷。

參數(shù):

  • view_name 應(yīng)該用作關(guān)系目標(biāo)的視圖名稱璧坟。如果您使用的是標(biāo)準(zhǔn)路由器類既穆,則它將是格式為 <model_name>-detail 的字符串。必選參數(shù)
  • lookup_field 應(yīng)該用于查找的目標(biāo)上的字段雀鹃。應(yīng)該對(duì)應(yīng)于引用視圖上的 URL 關(guān)鍵字參數(shù)幻工。默認(rèn)值為 pk
  • lookup_url_kwarg 與查找字段對(duì)應(yīng)的 URL conf 中定義的關(guān)鍵字參數(shù)的名稱。默認(rèn)使用與 lookup_field 相同的值
  • format 如果使用 format 后綴黎茎,超鏈接字段將對(duì)目標(biāo)使用相同的 format 后綴囊颅,除非使用 format 參數(shù)進(jìn)行覆蓋

序列化模型如下

class AlbumSerializer(serializers.HyperlinkedModelSerializer):
    track_listing = serializers.HyperlinkedIdentityField(view_name='track-list')

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'track_listing')

序列化結(jié)果如下:

{
    'album_name': 'The Eraser',
    'artist': 'Thom Yorke',
    'track_listing': 'http://www.example.com/api/track_list/12/',
}

嵌套序列化關(guān)系模型

在序列化模型中指定嵌套序列化關(guān)系模型將返回一個(gè)該嵌套序列化關(guān)系模型對(duì)應(yīng)的數(shù)據(jù)模型中序列化的數(shù)據(jù)。
讀起來(lái)有些拗口傅瞻,看例子吧踢代。

參數(shù):

  • many 如果應(yīng)用于多對(duì)多關(guān)系,則應(yīng)將此參數(shù)設(shè)置為 True

序列化模型如下

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ('order', 'title', 'duration')

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

序列化結(jié)果如下:

 {
    'album_name': 'The Grey Album',
    'artist': 'Danger Mouse',
    'tracks': [
        {'order': 1, 'title': 'Public Service Announcement', 'duration': 245},
        {'order': 2, 'title': 'What More Can I Say', 'duration': 264},
        {'order': 3, 'title': 'Encore', 'duration': 159},
    ],
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俭正,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子焙畔,更是在濱河造成了極大的恐慌掸读,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宏多,死亡現(xiàn)場(chǎng)離奇詭異儿惫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)伸但,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門肾请,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人更胖,你說(shuō)我怎么就攤上這事铛铁。” “怎么了却妨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵饵逐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我彪标,道長(zhǎng)倍权,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任捞烟,我火速辦了婚禮薄声,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘题画。我一直安慰自己默辨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布苍息。 她就那樣靜靜地躺著廓奕,像睡著了一般抱婉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桌粉,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天蒸绩,我揣著相機(jī)與錄音,去河邊找鬼铃肯。 笑死患亿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的押逼。 我是一名探鬼主播步藕,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挑格!你這毒婦竟也來(lái)了咙冗?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漂彤,失蹤者是張志新(化名)和其女友劉穎雾消,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挫望,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡立润,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了媳板。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桑腮。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛉幸,靈堂內(nèi)的尸體忽然破棺而出破讨,到底是詐尸還是另有隱情,我是刑警寧澤奕纫,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布添忘,位于F島的核電站,受9級(jí)特大地震影響若锁,放射性物質(zhì)發(fā)生泄漏搁骑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一又固、第九天 我趴在偏房一處隱蔽的房頂上張望仲器。 院中可真熱鬧,春花似錦仰冠、人聲如沸乏冀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辆沦。三九已至昼捍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肢扯,已是汗流浹背妒茬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔚晨,地道東北人乍钻。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铭腕,于是被迫代替她去往敵國(guó)和親银择。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容