没有使用ModelSerializer序列化器时,我们自定义的序列化器类需要添加对应模型类中的很多字段,但是如果添加的字段有成百个,是否也需要一个一个手动添加呢?所以有一种更为简洁的模型序列化器类来帮我们优化框架代码,简化序列化器类中字段的创建
普通序列化器类示例:
class ProjectsSerializer(serializers.Serializer):
name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',validators=[ validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])
leader = serializers.CharField(max_length=200, label='项目负责人', help_text='项目负责人帮助文档')
tester = serializers.CharField(max_length=200, label='测试人员', help_text='测试人员帮助文档',
error_messages={"required": "tester该字段必传", "max_length": "长度不能操作5个字节"})
使用模型序列化器类(ModelSerializer)如下:
class ProjectsModelSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = '__all__'
可以看见,已经简化很多,规则总结如下:
直接使用ModelSerializer实例化的对象替换掉原先的序列化器类对象
class IndexPageView(View):
def get(self, request):
"""
get请求,请求所有数据,未分页
:param request:
:return:
"""
qs = Project.objects.all()
# ser_obj = ProjectsSerializer(instance=qs, many=True)
ser_obj = ProjectsModelSerializer(instance=qs, many=True)
return JsonResponse(ser_obj.data, status=200, safe=False)
1.默认全部字段输出或输入
在Meta子类中定义类属性fields=‘all’
fields = '__all__'
2.指定需要输出或输入的字段
在Meta子类中定义类属性fields=(字段1,字段2,…)
fields = ('id', 'name', 'leader', 'tester','email')
3.排除不需要输出或输入的字段
在Meta子类中定义类属性exclude=(字段1,字段2,…)
exclude = ('desc',)
4.只允许序列化输出
在Meta子类中定义类属性read_only_fields=(字段1,字段2,…)
read_only_fields = ('id',)
5.自定义校验规则
5-1.在ModelSerializer类中创建字段类的对象
其优先级最高,如果以该方式创建的字段很多,可以选择普通的序列化器类来定义
class ProjectsModelSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',
validators=[
validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])
class Meta:
model = Project
fields = ('id', 'name', 'leader', 'tester', 'email')
5-2.在Meta子类中定义extra_kwargs字段
键为字段名,值为一个字典,其中键为校验项,值为校验规则
class ProjectsModelSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',
validators=[
validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])
class Meta:
model = Project
fields = ('id', 'name', 'leader', 'tester')
extra_kwargs = {
'tester': {
'label': '测试负责人',
'max_length': 2
}
}
class ProjectsModelSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',
validators=[
validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])
email = serializers.EmailField(max_length=50)
class Meta:
model = Project
fields = ('id', 'name', 'leader', 'tester', 'email')
extra_kwargs = {
'tester': {
'label': '测试负责人',
'max_length': 2
}
}
def create(self, validated_data):
email = validated_data.pop('email')
return super().create(validated_data)
本文地址:https://blog.csdn.net/weixin_47454485/article/details/107354474
如对本文有疑问, 点击进行留言回复!!
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
网友评论