Django Rest Framework 序列化關係模型

這兩天一直在學習 Django Rest Framework 這個框架,這是一個很是流行的 REST API 框架,深度整合 Django。但與傳統 MVC 模式的不一樣, Django REST Framework 在使用過程當中,須要理解一些新的東西。結合官方 API 分享一下框架中關於序列化關係模型的理解。javascript

序列化模型與序列化關係模型

序列化模型,顧名思義,即對 models 裏的數據模型做序列化。而序列化關係模型則是對 models 裏數據模型中帶有關係的如 ForeignKey, ManyToManyFieldOneToOneField 字段做序列化。Django Rest Framework 提供了靈活的序列化關係模型,讓開發者能夠自由定製序列化數據模型。java

序列化關係模型

根據官方的例子來看一下每個關係模型的介紹。python

數據模型以下:api

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 將返回一個對應關係 model 的 __unicode__() 方法的字符串。框架

這個字段是隻讀的。學習

參數:url

  • many 若是應用於多對多關係,則應將此參數設置爲 Truecode

序列化模型以下orm

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

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

序列化結果以下:ip

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

PrimaryKeyRelatedField

使用 PrimaryKeyRelatedField 將返回一個對應關係 model 的主鍵。

參數:

  • queryset 用於在驗證字段輸入時模型實例查找。 關係必須明確設置 queryset,或設置 read_only = True

  • many 若是是對應多個的關係,就設置爲 True

  • allow_null 若是設置爲 True,則該字段將接受 None 的值或爲空的關係的空字符串。默認爲 False

  • pk_field 設置爲一個字段以控制主鍵值的序列化/反序列化。例如,pk_field = UUIDField(format ='hex') 將UUID主鍵序列化爲緊湊的十六進制表示。

序列化模型以下

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

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

序列化結果以下:

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

HyperlinkedRelatedField

使用 HyperlinkedRelatedField 將返回一個超連接,該連接指向對應關係 model 的詳細數據,view-name 是必選參數,爲對應的視圖生成超連接。

參數:

  • view_name 用做關係目標的視圖名稱。若是使用的是標準路由器類,那麼它的格式爲 <modelname>-detail 的字符串

  • queryset 驗證字段輸入時用於模型實例查詢的查詢器。關係必須明確設置 queryset,或設置 read_only = True

  • many 若是應用於多對多關係,則應將此參數設置爲 True

  • allow_null 若是設置爲 True,則該字段將接受 None 的值或爲空的關係的空字符串。默認爲 False

  • lookup_field 應該用於查找的目標上的字段。應該對應於引用視圖上的 URL 關鍵字參數。默認值爲 pk

  • lookup_url_kwarg 與查找字段對應的 URL conf 中定義的關鍵字參數的名稱。默認使用與 lookup_field 相同的值

  • format 若是使用 format 後綴,超連接字段將對目標使用相同的 format 後綴,除非使用 format 參數進行覆蓋。

序列化模型以下

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')

序列化結果以下:

{
    '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 將返回一個指定對應關係 model 中的字段,須要擦參數 slug_field 中指定字段名稱。

參數:

  • slug_field 應該用於表示目標的字段。這應該是惟一標識任何給定實例的字段。例如 username 。這是必選參數

  • queryset 驗證字段輸入時用於模型實例查詢的查詢器。 關係必須明確設置 queryset,或設置 read_only = True

  • many 若是應用於多對多關係,則應將此參數設置爲 True

  • allow_null 若是設置爲 True,則該字段將接受 None 的值或爲空的關係的空字符串。默認爲 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')

序列化結果以下:

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

HyperlinkedIdentityField

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

參數:

  • view_name 應該用做關係目標的視圖名稱。若是您使用的是標準路由器類,則它將是格式爲 <model_name>-detail 的字符串。必選參數

  • lookup_field 應該用於查找的目標上的字段。應該對應於引用視圖上的 URL 關鍵字參數。默認值爲 pk

  • lookup_url_kwarg 與查找字段對應的 URL conf 中定義的關鍵字參數的名稱。默認使用與 lookup_field 相同的值

  • format 若是使用 format 後綴,超連接字段將對目標使用相同的 format 後綴,除非使用 format 參數進行覆蓋

序列化模型以下

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

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

序列化結果以下:

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

嵌套序列化關係模型

在序列化模型中指定嵌套序列化關係模型將返回一個該嵌套序列化關係模型對應的數據模型中序列化的數據。
讀起來有些拗口,看例子吧。

參數:

  • many 若是應用於多對多關係,則應將此參數設置爲 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')

序列化結果以下:

{
    '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},
    ],
}
相關文章
相關標籤/搜索