嵌套的序列化关系复杂了,默认的ModelSerializer的 .create() 和 .update() 方法是不支持nested representations的。所以REST framework 3要求你针对nested representations自己写专门的方法。
一个替代方案是“在模型管理器类中保存相关实例”。
处理多个对象
- Serializing multiple objects
设置many=true
queryset = Book.objects.all()
serializer = BookSerializer(queryset, many=True)
serializer.data
使用context可以添加其它字段,.to_representation()方法通过self.context属性访问。
serializer = AccountSerializer(account, context={'request': request})
serializer.data
ModelSerializer
快速建立相关模型的serializer 模型
- 自动产生基于模型的fileds
- 自动产生验证器,比如unique_together验证器
- 默认包含create和uodate方法
外键被映射为PrimaryKeyRelatedField.
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ('id', 'account_name', 'users', 'created')
检查modelserializer
python manage.py shell
>>> 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())
显示哪些字段
fields = ('id', 'account_name', 'users', 'created')
fields = '__all__'
exclude = ('users',)
Specifying nested serialization
ModelSerializer默认使用关联模型的主要关键字,指明depth可以得到更多
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ('id', 'account_name', 'users', 'created')
depth = 1
自定义字段
在serilaizer里面指定对应的函数,source='get_absolute_url',
class AccountSerializer(serializers.ModelSerializer):
url = serializers.CharField(source='get_absolute_url', read_only=True)
groups = serializers.PrimaryKeyRelatedField(many=True)
class Meta:
model = Account
Specifying read only fields
设置了editable=False和AutoField字段的默认是read-only.
read_only_fields = ('account_name',)
注意:即使read-only对象又unique_together限制,这时Providing both the read_only=True and default=… keyword arguments.
serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
附加关键字参数
与read_only_fields一样,这意味着您不需要在串行器上显式声明该字段。
将字段名称映射到关键字参数的字典。
extra_kwargs = {'password': {'write_only': True}}
关联字段
替代表示:使用超链接进行序列化,序列化完整的嵌套表示,或使用自定义表示序列化。
Customizing field mappings通常,如果一个ModelSerializer没有生成默认情况下需要的字段,那么您应该将它们明确地添加到类中,或者直接使用常规的Serializer类。 但是在某些情况下,您可能需要创建一个新的基类,定义如何为任何给定的模型创建序列化程序字段。
- .serializer_field_mapping
- .serializer_related_field
- serializer_url_field
- serializer_choice_field