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

  • 基于模型类自动生成一系列字段;
  • 基于模型类自动为Serializer生成validators,比如unique_together;
  • 包含默认的create()和update()的实现。

    1. 定义

  • 在有序列化器的基础上再定义模型类序列化器。

已知模型类BookInfo:

  1. class BookInfo(models.Model):
  2. btitle = models.CharField(max_length=20, verbose_name='名称')
  3. bpub_date = models.DateField(verbose_name='发布日期')
  4. bread = models.IntegerField(default=0, verbose_name='阅读量')
  5. bcomment = models.IntegerField(default=0, verbose_name='评论量')
  6. is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
  7. class Meta:
  8. db_table = 'tb_books' # 指明数据库表名
  9. verbose_name = '图书' # 在admin站点中显示的名称
  10. verbose_name_plural = verbose_name # 显示的复数名称
  11. def __str__(self):
  12. """定义每个数据对象的显示信息"""
  13. return self.btitle

创建对应的模型类序列化器:———————-导包:**from rest_framework import serializers**

  1. from rest_framework import serializers
  2. class BookInfoSerializer(serializers.ModelSerializer):
  3. """图书数据序列化器"""
  4. class Meta:
  5. model = BookInfo
  6. """
  7. 具体指明那些字段: fields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment')
  8. 使用exclude可以明确排除掉哪些字段:exclude = ('image',)
  9. """
  10. fields = '__all__'
  11. read_only_fields = ('id', 'bread', 'bcomment')

class Meta属性:

  • model 指明参照哪个模型类
  • fields 指明为模型类的哪些字段生成,__all__表名包含所有字段,也可以写明具体哪些字段,
  • exclude —————-指明排除哪些字段
  • read_only_fields ————指明只读字段,即仅用于序列化输出的字段
  • extra_kwargs——————为ModelSerializer添加或修改原有的选项参数 ```python class BookInfoSerializer(serializers.ModelSerializer): “””图书数据序列化器””” class Meta:
    1. model = BookInfo
    2. fields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment')
    3. extra_kwargs = {
    4. 'bread': {'min_value': 0, 'required': True},
    5. 'bcomment': {'min_value': 0, 'required': True},
    6. }

BookInfoSerializer():

id = IntegerField(label=’ID’, read_only=True)

btitle = CharField(label=’名称’, max_length=20)

bpub_date = DateField(allow_null=True, label=’发布日期’, required=False)

bread = IntegerField(label=’阅读量’, max_value=2147483647, min_value=0, required=True)

bcomment = IntegerField(label=’评论量’, max_value=2147483647, min_value=0, required=True)

  1. class Meta外部,可以指明模型类中没有的字段。显示指明的字段必须包含在fields中,否则会报错。<br />我们可以在python manage.py shell中查看自动生成的BookInfoSerializer的具体实现:
  2. ```python
  3. >>> from booktest.serializers import BookInfoSerializer
  4. >>> serializer = BookInfoSerializer()
  5. >>> serializer
  6. BookInfoSerializer():
  7. id = IntegerField(label='ID', read_only=True)
  8. btitle = CharField(label='名称', max_length=20)
  9. bpub_date = DateField(allow_null=True, label='发布日期', required=False)
  10. bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
  11. bcomment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
  12. image = ImageField(allow_null=True, label='图片', max_length=100, required=False)