DRF-模型类序列化器的使用ModelSerializer

ModelSerializer可以根据指定的模型类,自动生成相应的序列化器字段,继承Serializer的时候所有方法是手写,现在使用继承ModelSerializer,不用手写模型类里的每个字段限制

class BookModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = BookInfo  # 指定生成字段的模型类
        fields = ('btitle', 'bread')  # 指定模型类中的字段

第一步 指定模型类

第二步使用fields属性

1、fields = ('btitle', 'bread') # 指定模型类中的字段,这种常用

2、如果想生成所有字段

fields = '__all__' 就会生成模型类中的所有字段

3、如果想取反操作

exclude =('btitle',) # 取反操作,除了这个字段外的其他字段都生成

验证方式

python manage.py shell 进入django交互环境

from book_drf.serializer import BookModelSerializer

BookModelSerializer()

可以看出自动帮我们生成了校验值,但是有些值不太符合我们要求

如果想修改字段限制,有两种方式

第一种、显示指明字段

class BookModelSerializer(serializers.ModelSerializer):
    # 显示指明字段,
    bread = serializers.IntegerField(max_value=100, min_value=20)
    sms_code = serializers.CharField(max_length=6, min_length=6)
    class Meta:
        model = BookInfo  # 指定生成字段的模型类
        # fields = ('btitle', 'bread')  # 指定模型类中的字段
        # fields = '__all__'  # 指定模型类中的字段
        exclude =('btitle',)  # 取反操作,除了这个字段外的其他字段都生成

 每次修改完,如果想看修改结果,需要重新退出进入python manage.py shell。

显示指明字段也可以,新增没有的字段,例如新增一个sms_code字段

class BookModelSerializer(serializers.ModelSerializer):
    # 显示指明字段,
    bread = serializers.IntegerField(max_value=100, min_value=20)
    sms_code = serializers.CharField(max_length=6, min_length=6)
    class Meta:
        model = BookInfo  # 指定生成字段的模型类
        # fields = ('btitle', 'bread')  # 指定模型类中的字段
        # fields = '__all__'  # 指定模型类中的字段
        exclude =('btitle',)  # 取反操作,除了这个字段外的其他字段都生成

 第二种方式,使用extra_kwargs,也可以对已有的字段进行修改,或者新增没有的字段校验

class BookModelSerializer(serializers.ModelSerializer):
    # 显示指明字段,可以指明已有的字段,还可以指明没有的字段
    bread = serializers.IntegerField(max_value=100, min_value=20)
    sms_code = serializers.CharField(max_length=6, min_length=6)
    class Meta:
        model = BookInfo  # 指定生成字段的模型类
        # fields = ('btitle', 'bread')  # 指定模型类中的字段
        fields = '__all__'  # 指定模型类中的字段
        # vexclude =('btitle')  # 取反操作,除了这个字段外的其他字段都生成

        # 添加修改字段的选项参数
        extra_kwargs = {
            "bcomment":{
                'max_value': 80
            },
            'btitle':{
                'min_length': 5
            }
        }

 注意在使用新增未存在的字段时候,需要使用fields = '__all__'  或者fields = ('btitle', 'bread') 定义出来这个字段,否则会报错,找不到这个字段。

三、还有一个添加选项参数的方法

read_only_fields = ('btitle',) ,给字段增加read_only的参数

class BookModelSerializer(serializers.ModelSerializer):
    # 显示指明字段,可以指明已有的字段,还可以指明没有的字段
    bread = serializers.IntegerField(max_value=100, min_value=20)
    sms_code = serializers.CharField(max_length=6, min_length=6)
    class Meta:
        model = BookInfo  # 指定生成字段的模型类
        # fields = ('btitle', 'bread')  # 指定模型类中的字段
        fields = '__all__'  # 指定模型类中的字段
        # vexclude =('btitle')  # 取反操作,除了这个字段外的其他字段都生成
        # 给字段增加 read_only的选项参数
        read_only_fields = ('btitle',)
        # 添加修改字段的选项参数
        extra_kwargs = {
            "bcomment":{
                'max_value': 80
            },
            'btitle':{
                'min_length': 5
            }
        }

 总结:

ModelSerializer可以对我们指定的模型类,自动的生成字段内容

ModelSerializer与常规的Serializer区别

1、基于模型类自动生成一些列字段

2、基于模型类自动为Serializer生成validators,比如unique_together

3、包含默认的create()和update()的实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NeilNiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值