文章目录
- [1 检查ModelSerializer](#1 检查ModelSerializer)
- [2 指定要包含的字段](#2 指定要包含的字段)
- [3 指定嵌套序列化](#3 指定嵌套序列化)
- [4 显式指定字段](#4 显式指定字段)
- [5 指定只读字段](#5 指定只读字段)
- [6 其他关键字参数](#6 其他关键字参数)
- [7 关系字段](#7 关系字段)
- [8 自定义字段映射](#8 自定义字段映射)
通常,您会想要与Django Model 定义紧密映射的 Serializer
类。
ModelSerializer
类提供了一个快捷方式,使用该快捷方式可以自动创建具有与Model字段对应的字段的 Serializer
类别。
ModelSerializer
类与常规 Serializer
类相同,不同之处在于:
-
它将根据模型自动为您生成一组字段。
-
它将自动为序列化程序生成验证器,例如
unique_together
验证器。 -
它包括.create()和.update()的简单默认实现。
声明ModelSerializer如下所示:
py
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ['id', 'account_name', 'users', 'created']
默认情况下,类上的所有模型字段都将映射到相应的序列化程序字段。
模型上的任何关系(如外键)都将映射到 PrimaryKeyRelatedField
。默认情况下不包括反向关系,除非按照序列化程序关系文档中的指定显式包括反向关系。
1 检查ModelSerializer
序列化程序类生成有用的详细表示字符串,使您能够完全检查其字段的状态。当使用 ModelSerializers
时,这一点尤其有用,因为在ModelSerializers
中,您需要确定自动为您创建的字段和验证器集。
要做到这一点,请使用 python manage.py shell
打开 Django shell,然后导入序列化程序类,实例化它,并打印对象表示...
py
>>> 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, required=False)
owner = PrimaryKeyRelatedField(queryset=User.objects.all())
2 指定要包含的字段
如果只希望在模型序列化程序中使用默认字段的子集,可以使用 fields
或 exclude
选项,就像使用 ModelForm
一样。强烈建议您使用 fields
属性显式设置应序列化的所有字段。这将在模型更改时无意中暴露数据的可能性降到最低。
例如:
py
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ['id', 'account_name', 'users', 'created']
您还可以将 fields
属性设置为特殊值 '__all__'
,以指示应使用模型中的所有字段。
例如:
py
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = '__all__'
可以用 exclude
属性指定要从序列化程序中排除的字段列表。
例如:
py
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
exclude = ['users']
3 指定嵌套序列化
默认的ModelSerializer将主键用于关系,但也可以使用深度选项轻松生成嵌套表示:
py
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ['id', 'account_name', 'users', 'created']
depth = 1
depth选项应设置为一个整数值,该整数值指示在恢复为平面表示之前应遍历的关系的深度。
如果您想自定义序列化的完成方式,您需要自己定义字段。
4 显式指定字段
您可以向 ModelSerializer
添加额外的字段,或者通过在类上声明字段来覆盖默认字段,就像对 Serializer
类一样。
py
class AccountSerializer(serializers.ModelSerializer):
url = serializers.CharField(source='get_absolute_url', read_only=True)
groups = serializers.PrimaryKeyRelatedField(many=True)
class Meta:
model = Account
fields = ['url', 'groups']
额外字段可以对应于模型上的任何属性或可调用字段。
5 指定只读字段
您可能希望将多个字段指定为只读字段。您可以使用快捷方式Meta选项 read_only_fields
,而不是使用 read_only=True
属性显式添加每个字段。
此选项应该是字段名称的列表或元组,声明如下:
py
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ['id', 'account_name', 'users', 'created']
read_only_fields = ['account_name']
默认情况下,editable=False
设置的模型字段和 AutoField
字段将设置为只读,不需要添加到 read_only_fields
选项中。
6 其他关键字参数
还有一个快捷方式允许您使用 extra_kwargs
选项在字段上指定任意附加的关键字参数。与read_only_fields
的情况一样,这意味着您不需要在序列化程序上显式声明字段。
此选项是一个字典,将字段名映射到关键字参数的字典。例如:
py
class CreateUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['email', 'username', 'password']
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(
email=validated_data['email'],
username=validated_data['username']
)
user.set_password(validated_data['password'])
user.save()
return user
请记住,如果字段已经在序列化程序类上显式声明,那么 extra_kwargs
选项将被忽略。
7 关系字段
在序列化模型实例时,可以选择多种不同的方式来表示关系。ModelSerializer
的默认表示形式是使用相关实例的主键。
替代表示法包括使用超链接序列化、序列化完整嵌套表示法或使用自定义表示法序列化。
有关完整的详细信息,请参阅序列化程序关系文档。
8 自定义字段映射
ModelSerializer类还公开了一个API,您可以重写该API,以便在实例化序列化程序时更改自动确定序列化程序字段的方式。
通常,如果ModelSerializer默认情况下不生成所需的字段,则应将它们显式添加到类中,或者仅使用常规Serializer类。但是,在某些情况下,您可能希望创建一个新的基类,该基类定义如何为任何给定的模型创建序列化程序字段。
.serializer_field_mapping
Django模型字段到REST框架序列化程序字段的映射。您可以覆盖此映射以更改应用于每个模型字段的默认序列化程序字段。
.serializer_related_field
此属性应该是序列化程序字段类,默认情况下用于关系字段。
对于 ModelSerializer
,这默认为serializers.PrimaryKeyRelatedField
。
对于 HyperlinkedModelSerializer
,这默认为 serializers.HyperlinkedRelatedField
。
serializer_url_field
应用于序列化程序上任何 url
字段的序列化程序字段类。
默认为 serializers.HyperlinkedIdentityField
.serializer_choice_field
应用于序列化程序上的任何 choice
字段的序列化.
默认为 serializers.ChoiceField