序列化器关系

关系字段用于表示模型关系。它们可以应用于ForeignKeyManyToManyFieldOneToOneField关系,以及反向关系和自定义关系。
注意,关系字段在relations.py中声明,但按照惯例,应该从serializers模块导入它们,使用from rest_framework import serializers并像serializers.<FieldName>这样引用字段。

检查关系

当使用ModelSerializer类时,将自动生成序列化器字段和关系。检查这些自动生成的字段可以作为确定如何定制关系样式的有用工具。
示例:

from myapp.serializers import AccountSerializer
serializer = AccountSerializer()
print(repr(serializer))

AccountSerializer():
    id = IntegerField(label="ID", read_only=True)
    name = CharField(allow_blank=True, max_length=100, reuqired=False)
    owner = PrimaryKeyRelatedField(queryset=User.objects.all())

API参考

示例:

class Album(modles.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)

class Track(mdoels.Model):
    ablum = models.ForeignKey("Album", related_name="tracks", on_delete=models.CASCADE)
    order = models.IntegerField()
    title = models.CharField(max_length=100)

    class Meta:
        unique_together = ("album", "order")
        ordering = ["order"]

    def __str__(self):
        return "%d: %s" % (self.order, self.title)

StringRelatedField

StringRelatedField可用__unicode__方法来表示关系的目标。
序列化器示例:

class AlbumSerializer(serializers.ModelSerialzier):
    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",
    ]
}

该字段只是只读。
参数:

  • many:如果是一对多的关系,就将此参数设置为True。

PrimaryKeyRelatedField

PrimaryKeyRelatedField可用于使用其主键表示关系的目标。
序列化器示例:

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ("album_name", "artist", "track")

序列化表示:

{
    "album_name": "Undun",
    "artist": "The Roots",
    "tracks": [
        89,
        90,
        91,
        ...
    ]
}

默认情况下,此字段是读写的,但可用使用read_only标志更改此行为,
参数:

  • queryset:验证字段输入时用于模型实例查询的查询集。关系必须显式地设置查询集,或设置read_only=True
  • many:如果应用于一对多关系,则应将此参数设置为True。
  • allow_null:如果设置为True,那么该字段将接受None值或可为空的关系的空字符串。默认为False。
  • pk_field:设置字段来控制主键值的序列化/反序列化。例如,pk_field=UUIDField(format="hex")会将UUID主键序列化为其紧凑的十六进制表示形式。

HyperlinedRelatedField

HyperlinkedRelatedField可用于使用超连接表示关系的目标。
序列化示例:

class AlbumSerializer(serializers.MoldelSerializer):
    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标志更改行为。
注意,该字段设计用于映射到接受单个URL关键字参数的URL的对象,使用lookup_field和lookup_url_kwarg参数的设置。
这适用于包含单个主键或slug参数作为URL一部分的URL。

参数:

  • view_name:用作关系目标的视图名称。如果使用的是标准路由器类,则这将是格式为<modelname>-detail的字符串。
  • queryset:验证字段输入时,用于模型示例查询的查询集。关系必须显示地设置查询集,或设置为read_only=True
  • many:如果应用于一对多关系,则应将此参数设置为True。
  • allow_null:如果设置为True,那么该字段将接受None值或可为空的关系的空字符串,默认为False。
  • lookup_field:用于查找的目标字段。对应于引用视图上URL关键字参数。默认是pk。
  • lookup_url_kwarg:与查找字段对应的URLconf中定义的关键字参数的名称,默默认使用与lookup_field相同的值。
  • format:如果使用格式后缀,则超链接字段将使用与目标相同的格式后缀,除非使用format字段重写。

SlugRelatedField

SlugRelatedField可用于使用目标上的字段来表示关系的目标。
序列化器示例:

class AlbumSerializer(serializers.ModelSerailizer);
    tracks = serializers.SlugRelatedField(
        many=True,
        read_only=True,
        slug_field="title"
    )

    class Meta:
        model = Album
        fields = ("album_name", "arist", "tracks")

序列化表示:

{
    'album_name': 'Dear John',
    'artist': 'Loney Dear',
    'tracks': [
        'Airport Surroundings',
        'Everything Turns to You',
        'I Was Only Going Out',
        ...
    ]
}

默认情况下,此字段是读写的,但可以是用read_only标志更改此行为。
当使用SlugRelatedField作为读写字段时,通常需要确保slug字段与unique=True的模型字段相对应。
参数:

  • slug_field:目标上应该用来表示它的字段。这应该是唯一标识任何给定实例的字段。必填。
  • queryset:验证字段输入时用于模型示例查询的查询集。关系必须显式地设置查询集,或设置read_only=True
  • many:如果应用于一对多关系,则应将此参数设置为True。
  • allow_null:如果设置为True,那么该字段将接受None值或可为空的关系的空字符串。默认为False。
HyperlinkedIdentityField

此字段可以作为标识关系应用,例如HyperlinkedModelSerializer上url字段。它也可以用于对象的属性。
序列化器示例:

class AlbumSerializer(serializers.HyperlinkedModelSerialzier):
    track_listig = serilaizers.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/',
}

该字段始终为只读。
参数:

  • view_name:用作关系目标的视图名称,如果使用的是标准路由器,则这将是格式为<modelname>-detail的字符串。必填。
  • lookup_field:用于查找的目标字段。对应于引用视图上URL关键字参数。默认是pk。
  • lookup_url_kwarg:与查找字段对应的URLconf中定义的关键字参数的名称,默默认使用与lookup_field相同的值。
  • format:如果使用格式后缀,则超链接字段将使用与目标相同的格式后缀,除非使用format字段重写。

嵌套关系

可以使用序列化器作为字段来表示嵌套关系。
如果该字段用于表示一对多关系,应将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 = Album.objects.create(album_name="The Grey Album", artist='Danger Mouse')

>>> Track.objects.create(album=album, order=1, title='Public Service Announcement', duration=245)
<Track: Track object>

>>> Track.objects.create(album=album, order=2, title='What More Can I Say', duration=264)
<Track: Track object>

>>> Track.objects.create(album=album, order=3, title='Encore', duration=159)
<Track: Track object>

>>> serializer = AlbumSerializer(instance=album)
>>> serializer.data
{
    '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},
        ...
    ],
}

可写嵌套序列化器

默认情况下,嵌套序列化器时只读的。如果要支持对嵌套序列化器字段的写操作,则需要创建create()和update()方法,以便显式指定应如何保存子关系。

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ['order', 'title', 'duration']

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True)

    class Meta:
        model = Album
        fields = ['album_name', 'artist', 'tracks']

    def create(self, validated_data):
        tracks_data = validated_data.pop('tracks')
        album = Album.objects.create(**validated_data)
        for track_data in tracks_data:
            Track.objects.create(album=album, **track_data)
        return album

>>> data = {
    '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},
    ],
}
>>> serializer = AlbumSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<Album: Album object>
0条评论

相关推荐

django教程

r

Django 2019-05-20 10:53:53

Celery

celery学习资料

Django 2019-05-25 18:41:55

django教程入门

适合django新人使用的学习手册

Django 2019-07-01 14:28:04

django实用资料

django项目从0到1自己总结的实用的资料,大部分常用的功能这里都有

Django 2019-05-08 18:21:34