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

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

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

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

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

根據(jù)官方的例子來看一下每一個(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è)對應(yīng)關(guān)系 model 的 __unicode__() 方法的字符串。

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

參數(shù):

  • many 如果應(yīng)用于多對多關(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è)對應(yīng)關(guān)系 model 的主鍵。

參數(shù):

  • queryset 用于在驗(yàn)證字段輸入時(shí)模型實(shí)例查找。 關(guān)系必須明確設(shè)置 queryset,或設(shè)置 read_only = True
  • many 如果是對應(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ù),為對應(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)用于多對多關(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)該對應(yīng)于引用視圖上的 URL 關(guān)鍵字參數(shù)。默認(rèn)值為 pk
  • lookup_url_kwarg 與查找字段對應(yīng)的 URL conf 中定義的關(guān)鍵字參數(shù)的名稱。默認(rèn)使用與 lookup_field 相同的值
  • format 如果使用 format 后綴,超鏈接字段將對目標(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è)指定對應(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)用于多對多關(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)該對應(yīng)于引用視圖上的 URL 關(guān)鍵字參數(shù)。默認(rèn)值為 pk
  • lookup_url_kwarg 與查找字段對應(yīng)的 URL conf 中定義的關(guān)鍵字參數(shù)的名稱。默認(rèn)使用與 lookup_field 相同的值
  • format 如果使用 format 后綴,超鏈接字段將對目標(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)系模型對應(yīng)的數(shù)據(jù)模型中序列化的數(shù)據(jù)。
讀起來有些拗口,看例子吧。

參數(shù):

  • many 如果應(yīng)用于多對多關(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)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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