這兩天一直在學習 Django Rest Framework 這個框架,這是一個很是流行的 REST API 框架,深度整合 Django。但與傳統 MVC 模式的不一樣, Django REST Framework 在使用過程當中,須要理解一些新的東西。結合官方 API 分享一下框架中關於序列化關係模型的理解。javascript
序列化模型,顧名思義,即對 models 裏的數據模型做序列化。而序列化關係模型則是對 models 裏數據模型中帶有關係的如 ForeignKey
, ManyToManyField
和 OneToOneField
字段做序列化。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
將返回一個對應關係 model 的 __unicode__()
方法的字符串。框架
這個字段是隻讀的。學習
參數:url
many
若是應用於多對多關係,則應將此參數設置爲 True
code
序列化模型以下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
將返回一個對應關係 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
將返回一個超連接,該連接指向對應關係 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
將返回一個指定對應關係 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
將返回指定 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}, ], }