Loading

33.ModelSerializer详解

ModelSerializer特点
  • 根据Model模型的定义,自动生成字段
  • 自动生成相应的验证器
  • 实现create和update
  • 自动默认将关系字段映射成PrimaryKeyRelatedField主键关系字段
 
ModelSerializer指定序列化字段三种方法
class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        # 1.序列化指定字段
        fields = ('id', 'name',)
        # 2.序列化全部所有的字段
        fields = '__all__'
        # 3. 序列化除了user以外的所有字段
        exclude = ('user',)
        
'''
三种方法只能使用一种
第二种和第三种方法有暴露数据的风险
例如数据库有password字段,第二种会直接序列化出来,第三种,如果没有排除的话,也会序列化出来
'''
 
depth
depth用于指定序列化字段时嵌套的深度
如下其中的category分类返回了对应的两个分类id
不查看category数据的话
我们并不知道对应id的name是什么
 
class TextSerializer(serializers.ModelSerializer):
    auth = AuthSerializer()

    class Meta:
        model = Text
        fields = ('id', 'title', 'content', 'auth', 'category', 'created')
        # 修改Text序列化器,指定depth深度为1
        depth = 1
可以看出指定深度后,返回的内容 除了id还有对应的name
 
read_only_field
'''
如果我们使用Serializer类写序列化的时候,有字段希望只读不被修改的话,会通过read_only字段设定,例如
name = serializer.Charfield(read_only=True) 

在ModelSerializer中,如果要设定的只读字段的话使用read_only_field批量指定元组即可
不需要像serializer中一个一个字段设置指定
'''

class Meta:
    model = Text
    fields = ('id', 'title', 'content', 'auth', 'category', 'created')
    depth = 1
    read_only_field = ('created','auth',)
 
extra_kwargs额外的关键字参数
class Meta:
    model = Text
    fields = ('id', 'title', 'content', 'auth', 'category', 'created')
    depth = 1
    read_only_field = ('created','auth',)
    # 使用extra_kwargs指定字典
    extra_kwargs = {
        # key就是字段名,value就是要设置的参数
        'title':{'write_only':True,'require':True},
    }
 

posted @ 2022-10-08 15:24  木子七  阅读(169)  评论(0编辑  收藏  举报