比起自定义的序列化器,使用DRF已经写好的模型类序列化器可以大大简化代码,它主要有两个表现
(1)、根据指定的规则,自动映射字段参与序列化/反序列化
(2)、重写了create()和update()方法实现模型类对象的新建和更新逻辑
1.定义
新建一个类继承serializers.ModelSerializer
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
fields = '__all__'
Meta里的model指明参照哪个模型类,fields指明为模型类的哪些字段生成
2.指定字段
fields指定字段
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
fields = ('id', 'btitle', 'bpub_date')
exclude排除字段
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
exclude = ('image',)
read_only_fields只读字段
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
fields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment')
read_only_fields = ('id', 'bread', 'bcomment')
extra_kwargs添加额外参数
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
fields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment')
extra_kwargs = {
'bread': {
'min_value': 0, 'required': True},
'bcomment': {
'min_value': 0, 'required': True},
}
3.示例代码
from rest_framework import serializers
# serializers.ModelSerializer: 模型类序列化器基类
from .models import *
def check_btitle(value):
if "django" not in value:
raise serializers.ValidationError("这不是一本关于django的书")
class BookInfoModelSerializer(serializers.ModelSerializer):
class Meta:
# 1、声明当前序列化器针对的模型类
model = BookInfo # 潜台词,将来新建/更新的是BookInfo
# 2、声明参与序列化/反序列化的模型类字段
# 3、自动映射字段(主键隐藏字段自动映射,非主键隐藏字段不会)
fields = "__all__"
# 4、显示声明参与序列化/反序列化的字段
# fields = ['btitle', 'bpub_date', 'id', 'heros']
# 5、排除指定字段,把其他字段映射过来参与序列化/反序列化
# exclude = ['btitle', 'bpub_date']
# 6、调整字段的约束条件
extra_kwargs = {
'bread': {
'min_value': 0},
'bcomment': {
'min_value': 0},
# btitle = serializers.CharField(validator=[check_btitle])
# 'btitle': {'validators': [check_btitle]}
}
# 7、设置read_only=True的字段
# read_only_fields = ['id', 'btitle']
# def validate_btitle(self, value):
# if "django" not in value:
# raise serializers.ValidationError("这不是一本关于django的书")
# return value
def validate(self, attrs):
# 自定义校验
return attrs
如果想使用自定义的序列化器可以参考
【Django】DRF自定义序列化器、序列化与反序列化