嵌套的序列化关系复杂了,默认的ModelSerializer的 .create() 和 .update() 方法是不支持nested representations的。所以REST framework 3要求你针对nested representations自己写专门的方法。
一个替代方案是“在模型管理器类中保存相关实例”。
queryset = Book.objects.all()
serializer = BookSerializer(queryset, many=True)
serializer.data 使用context可以添加其它字段,.to_representation()方法通过self.context属性访问。
serializer = AccountSerializer(account, context={'request': request})
serializer.data 快速建立相关模型的serializer 模型
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类。 但是在某些情况下,您可能需要创建一个新的基类,定义如何为任何给定的模型创建序列化程序字段。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2370/viewspace-2799487/ ,如需转载,请注明出处,否则将追究法律责任。