摘要:結(jié)合官方分享一下框架中關(guān)于序列化關(guān)系模型的理解。而序列化關(guān)系模型則是對里數(shù)據(jù)模型中帶有關(guān)系的如和字段作序列化。提供了靈活的序列化關(guān)系模型,讓開發(fā)者可以自由定制序列化數(shù)據(jù)模型。例如,將主鍵序列化為緊湊的十六進制表示。
序列化模型與序列化關(guān)系模型這兩天一直在學(xué)習(xí) Django Rest Framework 這個框架,這是一個非常流行的 REST API 框架,深度整合 Django。但與傳統(tǒng) MVC 模式的不同, Django REST Framework 在使用過程中,需要理解一些新的東西。結(jié)合官方 API 分享一下框架中關(guān)于序列化關(guān)系模型的理解。
序列化模型,顧名思義,即對 models 里的數(shù)據(jù)模型作序列化。而序列化關(guān)系模型則是對 models 里數(shù)據(jù)模型中帶有關(guān)系的如 ForeignKey, ManyToManyField 和 OneToOneField 字段作序列化。Django Rest Framework 提供了靈活的序列化關(guān)系模型,讓開發(fā)者可以自由定制序列化數(shù)據(jù)模型。
序列化關(guān)系模型根據(jù)官方的例子來看一下每一個關(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 將返回一個對應(yīng)關(guān)系 model 的 __unicode__() 方法的字符串。
這個字段是只讀的。
參數(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 將返回一個對應(yīng)關(guān)系 model 的主鍵。
參數(shù):
queryset 用于在驗證字段輸入時模型實例查找。 關(guān)系必須明確設(shè)置 queryset,或設(shè)置 read_only = True
many 如果是對應(yīng)多個的關(guān)系,就設(shè)置為 True
allow_null 如果設(shè)置為 True,則該字段將接受 None 的值或為空的關(guān)系的空字符串。默認(rèn)為 False
pk_field 設(shè)置為一個字段以控制主鍵值的序列化/反序列化。例如,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")
序列化結(jié)果如下:
{ "album_name": "Undun", "artist": "The Roots", "tracks": [ 89, 90, 91, ... ] }HyperlinkedRelatedField
使用 HyperlinkedRelatedField 將返回一個超鏈接,該鏈接指向?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)路由器類,那么它的格式為
queryset 驗證字段輸入時用于模型實例查詢的查詢器。關(guān)系必須明確設(shè)置 queryset,或設(shè)置 read_only = True
many 如果應(yīng)用于多對多關(guān)系,則應(yīng)將此參數(shù)設(shè)置為 True
allow_null 如果設(shè)置為 True,則該字段將接受 None 的值或為空的關(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ù)進行覆蓋。
序列化模型如下
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 將返回一個指定對應(yīng)關(guān)系 model 中的字段,需要擦參數(shù) slug_field 中指定字段名稱。
參數(shù):
slug_field 應(yīng)該用于表示目標(biāo)的字段。這應(yīng)該是唯一標(biāo)識任何給定實例的字段。例如 username 。這是必選參數(shù)
queryset 驗證字段輸入時用于模型實例查詢的查詢器。 關(guān)系必須明確設(shè)置 queryset,或設(shè)置 read_only = True
many 如果應(yīng)用于多對多關(guān)系,則應(yīng)將此參數(shù)設(shè)置為 True
allow_null 如果設(shè)置為 True,則該字段將接受 None 的值或為空的關(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)路由器類,則它將是格式為
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ù)進行覆蓋
序列化模型如下
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)系模型將返回一個該嵌套序列化關(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)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45446.html
摘要:結(jié)合官方分享一下框架中關(guān)于序列化關(guān)系模型的理解。而序列化關(guān)系模型則是對里數(shù)據(jù)模型中帶有關(guān)系的如和字段作序列化。提供了靈活的序列化關(guān)系模型,讓開發(fā)者可以自由定制序列化數(shù)據(jù)模型。例如,將主鍵序列化為緊湊的十六進制表示。 這兩天一直在學(xué)習(xí) Django Rest Framework 這個框架,這是一個非常流行的 REST API 框架,深度整合 Django。但與傳統(tǒng) MVC 模式的不同, ...
摘要:結(jié)合官方分享一下框架中關(guān)于序列化關(guān)系模型的理解。而序列化關(guān)系模型則是對里數(shù)據(jù)模型中帶有關(guān)系的如和字段作序列化。提供了靈活的序列化關(guān)系模型,讓開發(fā)者可以自由定制序列化數(shù)據(jù)模型。例如,將主鍵序列化為緊湊的十六進制表示。 這兩天一直在學(xué)習(xí) Django Rest Framework 這個框架,這是一個非常流行的 REST API 框架,深度整合 Django。但與傳統(tǒng) MVC 模式的不同, ...
摘要:未經(jīng)身份驗證的請求應(yīng)具有完全只讀訪問權(quán)限。其中一個字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應(yīng)中文教程基于類的視圖中文教程驗證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗證的用戶可以創(chuàng)建...
摘要:未經(jīng)身份驗證的請求應(yīng)具有完全只讀訪問權(quán)限。其中一個字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應(yīng)中文教程基于類的視圖中文教程驗證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗證的用戶可以創(chuàng)建...
摘要:未經(jīng)身份驗證的請求應(yīng)具有完全只讀訪問權(quán)限。其中一個字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應(yīng)中文教程基于類的視圖中文教程驗證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗證的用戶可以創(chuàng)建...
閱讀 1927·2021-11-22 09:34
閱讀 1158·2021-10-09 09:44
閱讀 3051·2021-09-29 09:35
閱讀 3628·2021-09-14 18:01
閱讀 1497·2021-08-16 10:49
閱讀 1097·2019-08-29 14:11
閱讀 861·2019-08-29 12:47
閱讀 3082·2019-08-26 13:47