Rest Framework 關聯對象嵌套序列化

關聯對象嵌套序列化

		如果需要序列化的數據中包含有其他關聯對象,則對關聯對象數據的序列化需要指明。

例如,在定義英雄數據的序列化器時,外鍵Type(即所屬的分類)字段如何序列化?

對於關聯字段,可以採用以下幾種方式:

1、PrimaryKeyRelatedField

此字段將被序列化爲關聯對象的主鍵。
type = serializers.PrimaryKeyRelatedField(label=‘分類’, read_only=True)

type = serializers.PrimaryKeyRelatedField(label=‘分類’, queryset=BookInfo.objects.all())

指明字段時需要包含read_only=True或者queryset參數:
•包含read_only=True參數時,該字段將不能用作反序列化使用
•包含queryset參數時,將被用作反序列化時參數校驗使用

2、 StringRelatedField

此字段將被序列化爲關聯對象的字符串表示方式(即__str__方法的返回值)
type = serializers.StringRelatedField(label=‘分類’)

3、SlugRelatedField

此字段將被序列化爲關聯對象的指定字段數據
type = serializers.SlugRelatedField(label=‘分類’, read_only=True, slug_field=‘bpub_date’)
slug_field指明使用關聯對象的哪個字段

4、使用關聯對象的序列化器

hbook = BookInfoSerializer()
此字段只可以用GET方法

5、重寫to_representation方法

序列化器的每個字段實際都是由該字段類型的to_representation方法決定格式的,可以通過重寫該方法來決定格式。
注意,to_representations方法不僅侷限在控制關聯對象格式上,適用於各個序列化器字段類型。
定義一個新的關聯字段:
class TypeRelateField(serializers.RelatedField):
“”“自定義用於處理分類的字段”""
def to_representation(self, value):
return ‘Book: %d %s’ % (value.id, value.btitle)
指明type爲typeRelateField類型
type = typeRelateField(read_only=True)

6.HyperlinkedRelatedField

可以用於使用超鏈接表示關係的目標


例如,以下序列化程序:

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/’,

]
}
默認情況下,此字段是讀寫的,但您可以使用該read_only標誌更改此行爲。

many參數


如果關聯的對象數據不是隻有一個,而是包含多個數據,如想序列化分類TypeInfo數據,每個TypeInfo對象關聯的商品GoodInfo對象可能有多個,此時關聯字段類型的指明仍可使用上述幾種方式,只是在聲明關聯字段時,多補充一個many=True參數即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章