August Rush

一个还在努力成长的小火汁!

游龙当归海,海不迎我自来也。

We create our own demons.

You can reach me at augustrush0923@gmail.com
DRF-模型化序列器ModelSerializer
发布:2021年08月25日 | 作者:augustrush | 阅读量: 302

ModelSerializer与常规的Serializer相同,但提供了:

  • 基于模型类自动生成一些列字段
  • 基于模型类自动为Serializer生成validators
  • 包含默认的create()和update()的实现


定义

class BookInfoSerializer(serialzier.ModelSerializer):
    class Meta:
        model = BooksInfo  # 指明参照哪个模型类
        fields = '__all__' # 指明为模型类的哪些字段生成

实例:

from books.models import BooksInfo


serializer = BookInfoModelSerializer()
print(serializer)
'''
BookInfoModelSerializer():
    id = IntegerField(label='ID', read_only=True)
    title = CharField(label='名称', max_length=20)
    pub_date = DateField(label='发布日期')
    read = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
    comment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
    is_delete = BooleanField(label='逻辑删除', required=False)
'''


指定字段

通过fields来明确序列化/反序列化字段:

  • __all__代表所有字段:
class BookInfoSerializer(serialzier.ModelSerializer):
    class Meta:
        model = BooksInfo  # 指明参照哪个模型类
        fields = '__all__' # 指明为模型类的哪些字段生成
  • 显示指明字段:
class BookInfoSerializer(serialzier.ModelSerializer):
    class Meta:
        model = BooksInfo  # 指明参照哪个模型类
        fields = ('id', 'title', 'pub_date') # 指明为模型类的哪些字段生成
  • exclude字段可以明确排除掉哪些字段:
class BookInfoSerializer(serialzier.ModelSerializer):
    class Meta:
        model = BooksInfo  # 指明参照哪个模型类
        exclude = ('is_delete',)
  • 默认ModelSerializer使用主键作为关联字段,但是我们可以使用depth来简单的生成嵌套表示,depth应该是整数,表明嵌套的层级数量:
class HeroInfoModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = HeroInfo
        fields = '__all__'
        depth = 1

'''
HeroInfoModelSerializer():
    id = IntegerField(label='ID', read_only=True)
    name = CharField(label='名称', max_length=20)
    gender = ChoiceField(choices=((0, 'male'), (1, 'female')), label='性别', required=False, validators=[<django.core.validators.MinValueValidator object>, <django.core.validators.MaxValueValidator object>])
    desc = CharField(allow_null=True, label='描述信息', max_length=200, required=False)
    is_delete = BooleanField(label='逻辑删除', required=False)
    hero_book = NestedSerializer(read_only=True):
    id = IntegerField(label='ID', read_only=True)
    title = CharField(label='名称', max_length=20)
    pub_date = DateField(label='发布日期')
    read = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
    comment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
    is_delete = BooleanField(label='逻辑删除', required=False)
'''
  • 指明只读字段 可以通过read_only_fields指明只读字段,即仅用于序列化输出的字段
class BookInfoModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = BooksInfo
        fields = '__all__'
        read_only_fields = ('id', 'read', 'comment')
设置的只读字段还是能传入并save成功,只是不会修改数据库


添加额外参数

通过使用extra_kwargs参数可以为ModelSerializer添加或修改原有的选项参数

class BookInfoModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = BooksInfo
        fields = '__all__'
        extra_kwargs = {
            'read': {'min_value': 0}, 
            'comment': {'min_value': 0}
        }

'''
BookInfoModelSerializer():
    id = IntegerField(label='ID', read_only=True)
    title = CharField(label='名称', max_length=20)
    pub_date = DateField(label='发布日期')
    read = IntegerField(label='阅读量', max_value=2147483647, min_value=0, required=False)
    comment = IntegerField(label='评论量', max_value=2147483647, min_value=0, required=False)
    is_delete = BooleanField(label='逻辑删除', required=False)
'''


  • 标签云

  • 支付宝扫码支持一下

  • 微信扫码支持一下



基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建

版权所有 © 2020-2021 August Rush

京ICP备20007446号-1 & 豫公网安备 41100202000460号

网站地图 & RSS | Feed