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参数即可。

你可能感兴趣的:(Rest,Framework)