摘要:結合官方分享一下框架中關于序列化關系模型的理解。而序列化關系模型則是對里數據模型中帶有關系的如和字段作序列化。提供了靈活的序列化關系模型,讓開發者可以自由定制序列化數據模型。例如,將主鍵序列化為緊湊的十六進制表示。
序列化模型與序列化關系模型這兩天一直在學習 Django Rest Framework 這個框架,這是一個非常流行的 REST API 框架,深度整合 Django。但與傳統 MVC 模式的不同, Django REST Framework 在使用過程中,需要理解一些新的東西。結合官方 API 分享一下框架中關于序列化關系模型的理解。
序列化模型,顧名思義,即對 models 里的數據模型作序列化。而序列化關系模型則是對 models 里數據模型中帶有關系的如 ForeignKey, ManyToManyField 和 OneToOneField 字段作序列化。Django Rest Framework 提供了靈活的序列化關系模型,讓開發者可以自由定制序列化數據模型。
序列化關系模型根據官方的例子來看一下每一個關系模型的介紹。
數據模型如下:
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__() 方法的字符串。
這個字段是只讀的。
參數:
many 如果應用于多對多關系,則應將此參數設置為 True
序列化模型如下
class AlbumSerializer(serializers.ModelSerializer): tracks = serializers.StringRelatedField(many=True) class Meta: model = Album fields = ("album_name", "artist", "tracks")
序列化結果如下:
{ "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 用作關系目標的視圖名稱。如果使用的是標準路由器類,那么它的格式為
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 應該用作關系目標的視圖名稱。如果您使用的是標準路由器類,則它將是格式為
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}, ], }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45446.html
摘要:結合官方分享一下框架中關于序列化關系模型的理解。而序列化關系模型則是對里數據模型中帶有關系的如和字段作序列化。提供了靈活的序列化關系模型,讓開發者可以自由定制序列化數據模型。例如,將主鍵序列化為緊湊的十六進制表示。 這兩天一直在學習 Django Rest Framework 這個框架,這是一個非常流行的 REST API 框架,深度整合 Django。但與傳統 MVC 模式的不同, ...
摘要:結合官方分享一下框架中關于序列化關系模型的理解。而序列化關系模型則是對里數據模型中帶有關系的如和字段作序列化。提供了靈活的序列化關系模型,讓開發者可以自由定制序列化數據模型。例如,將主鍵序列化為緊湊的十六進制表示。 這兩天一直在學習 Django Rest Framework 這個框架,這是一個非常流行的 REST API 框架,深度整合 Django。但與傳統 MVC 模式的不同, ...
摘要:未經身份驗證的請求應具有完全只讀訪問權限。其中一個字段將用于表示創建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創建者相關聯。 只有身份驗證的用戶可以創建...
摘要:未經身份驗證的請求應具有完全只讀訪問權限。其中一個字段將用于表示創建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創建者相關聯。 只有身份驗證的用戶可以創建...
摘要:未經身份驗證的請求應具有完全只讀訪問權限。其中一個字段將用于表示創建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創建者相關聯。 只有身份驗證的用戶可以創建...
閱讀 1868·2021-11-22 09:34
閱讀 1141·2021-10-09 09:44
閱讀 3001·2021-09-29 09:35
閱讀 3617·2021-09-14 18:01
閱讀 1465·2021-08-16 10:49
閱讀 1084·2019-08-29 14:11
閱讀 849·2019-08-29 12:47
閱讀 3068·2019-08-26 13:47