继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Django rest framework之ModelSerializer 笔记(二)

无无法师
关注TA
已关注
手记 44
粉丝 54
获赞 130

嵌套的序列化关系复杂了,默认的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 模型

  1. 自动产生基于模型的fileds
  2. 自动产生验证器,比如unique_together验证器
  3. 默认包含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
打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP