ModelSerializer
DRF的serializers.Serializer所生成的序列化器是最基本的,它可以为数据库模型类定义,也可以为非数据库模型类的数据定义。一般而言,我们使用序列化器对应的都是Django的数据库模型类。DRF为我们提供了ModelSerializer来方便的对应于一个models.
ModelSerializer基于模型类自动生成一系列字段;此外还提供了create()和update()的默认实现。
下面定义新的序列化器,它将继承自ModelSerializer类。
class BookInfoSerializer2(serializers.ModelSerializer):
"""继承自serializers.ModelSerializer"""
class Meta:
model = BookInfo
fields = '__all__'
在终端中查看自动生成的序列化器如下:
>>> from apps.book.serializers import BookInfoSerializer2
>>> BookInfoSerializer2()
BookInfoSerializer2():
id = IntegerField(label='ID', read_only=True)
name = CharField(label='名称', max_length=20)
pub_date = DateField(label='发布日期')
readcount = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
commentcount = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
image = ImageField(allow_null=True, label='图片', max_length=100, required=False)
下面贴上model类的定义。
class BookInfo(models.Model):
"""书籍信息模型"""
name = models.CharField(max_length=20, verbose_name='名称')
pub_date = models.DateField(verbose_name='发布日期')
readcount = models.IntegerField(default=0, verbose_name='阅读量')
commentcount = models.IntegerField(default=0, verbose_name='评论量')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
image = models.ImageField(upload_to='book/', verbose_name='图片', null=True)
通过观察模型类和序列化器类,我们可以发现一些规律。 id是模型类默认生成的主键,序列化器让其变成只读(只能序列化,不能反序列化);通过name字段,可以发现模型类的verbose_name变成了序列化器中的label,max_length等对应不变;观察readcount字段,会发现整形类型会被序列化器自动加上max_value和min_value的限制;有默认值的字段,会自动加上required=False来取消限制;而允许为空的字段则会字段添加allow_null=True和required=False.
-
BookInfoSerializer2类中的fields = '__all__' 是特殊值,代表序列化所有字段。 -
通常fields是一个元组或者列表,例如: fields = ('name', 'readcount', 'commentcount')
-
使用exclude可以明确排除掉哪些字段 exclude = ('image', 'id')
-
指明只读字段 read_only_fields = ('id', 'name')
设置了editable=False的模型字段以及AutoField字段将默认设置为只读。 -
另外,如果你对ModelSerializer默认生成的某些字段的序列化器不满意,你可以手动重写某些字段的序列化。例如: class BookInfoSerializer2(serializers.ModelSerializer):
"""继承自serializers.ModelSerializer"""
name = serializers.CharField(read_only=True)
class Meta:
model = BookInfo
fields = '__all__'
-
extra_kwargs添加额外参数 extra_kwargs可以给默认生成的序列化器添加额外参数,上面的重写也能做到,并且重写甚至可以改变字段类型,例如从CharFiled变为IntegerField. 但是extra_kwargs更加方便。下面是一个例子: class BookInfoSerializer2(serializers.ModelSerializer):
"""继承自serializers.ModelSerializer"""
class Meta:
model = BookInfo
fields = '__all__'
extra_kwargs ={
"readcount": {"read_only": True, "max_value": 9999, "min_value": 0},
"commentcount": {"max_value": 9999, "min_value": 0}
}
通常,我们还需要实现字段验证,因为默认的is_valid()的验证是不够的。
|