Django rest framework之ModelSerializer 笔记(二)

释放双眼,带上耳机,听听看~!

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

【转自慕课】https://www.imooc.com

Python

Python观察者模式

2022-3-3 17:36:17

Python

Python编程笔记 - 基于udp协议的聊天小程序

2022-3-3 17:37:02

搜索