drf基本使用(3)_ModelSerializer的使用
ModelSerializer的简单使用
前面学习Serializers用法时,发现所有的序列化都与我们的模型紧密相关。
django_restframework也给我提供了跟模型紧密相关的序列化器——ModelSerializer。
它会根据模型自动生成一组字段;它简单的默认实现了.update()以及.create()方法。
定义ModelSerializer序列化器
指明只读字段
给字段添加额外参数——extra_kwargs
Save方法自动触发
三种字段校验方式
定义ModelSerializer序列化器
1 from rest_framework import serializers 2 from student import models 3 4 5 class StudentModelSerializer(serializers.ModelSerializer): 6 class Meta: 7 model = models.Student # 与Student表对应 8 # 1. 取全部字段 9 # fields = '__all__' 10 # 2. 自定义包含字段 11 fields = ['name', 'description'] 12 # 3. 排除某些字段 13 # exclude = ['age']
需要注意的是:取全部字段、取自定义字段、排除某些字段这三种筛选不能同时使用。
指明只读字段
指明只读字段[少用,通过extra_kwargs更方便一些],
可以通过read_only_fields
class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = models.Student fields = '__all__' read_only_fields = ['id']
模型字段有设置 editable=False, AutoField 字段默认设置为只读,不需要添加到 read_only_fields 选项。
给字段添加额外参数——extra_kwargs
使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数---字典格式。
class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = models.Student # 与Student表对应 fields = '__all__' extra_kwargs = { 'id': {'read_only': True}, 'name': {'max_length': 5, 'error_messages': { 'max_length': '您的用户名过长', } }, }
如果字段已在序列化程序类中显式声明,则该extra_kwargs
选项将被忽略。
Save方法自动触发
包含默认的create()和update()的实现
create
from rest_framework import serializers from student import models class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = models.Student # 与Student表对应 fields = '__all__' extra_kwargs = { 'id': {'read_only': True}, 'name': {'max_length': 5, 'error_messages': { 'max_length': '您的用户名过长', } }, }
serializer.py
1 class StudentView(APIView): 2 def get(self, request): 3 student = models.Student.objects.all() 4 serializer = StudentModelSerializer(instance=student, many=True) 5 return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) 6 7 def post(self, request): 8 serializer = StudentModelSerializer(data=request.data) 9 if serializer.is_valid(): 10 data = serializer.save() # ModelSerializer 中自动触发了create方法, 并返回了新增的数据对象 11 # 将用户添加的数据序列化后在返回 12 serializer = StudentModelSerializer(instance=data) # 这里的serializer和上面不同 13 return JsonResponse(serializer.data) 14 return JsonResponse({'error': '新增失败'})
update
1 from rest_framework.views import APIView 2 from student import models 3 from user.serializers import StudentModelSerializer 4 from django.http import JsonResponse 5 6 class StudentView(APIView): 7 def put(self, request): 8 id = request.data.get('id') 9 student_obj = models.Student.objects.get(pk=id) 10 # 创建序列化对象 11 serializer = StudentModelSerializer(data=request.data, partial=True, instance=student_obj) # partial只对传过来的字段进行校验 12 if serializer.is_valid(): 13 data = serializer.save() 14 serializer = StudentModelSerializer(instance=data) 15 return JsonResponse(serializer.data) 16 return JsonResponse({'error': '修改失败'})
三种字段校验方式
自定义函数校验
校验一下用户名的年龄
1 from rest_framework import serializers 2 from student import models 3 4 # 自定义校验函数 5 def check_age(val): 6 if val > 18: 7 raise serializers.ValidationError('老女人') 8 return val 9 10 class StudentModelSerializer(serializers.ModelSerializer): 11 class Meta: 12 model = models.Student # 与Student表对应 13 # fields = '__all__' 14 fields = ['name', 'age'] 15 extra_kwargs = { 16 'id': {'read_only': True}, 17 'name': {'max_length': 5, 18 'error_messages': { 19 'max_length': '您的用户名过长'} 20 }, 21 22 'age': { 23 "validators": [check_age] 24 # 注意校验哪个字段,就把validators添加到哪个字段的extra_kwargs中 25 } 26 }
views
1 class StudentView(APIView): 2 def post(self, request): 3 print(request.data) 4 serializer = StudentModelSerializer(data=request.data) 5 if serializer.is_valid(): 6 print(serializer.validated_data) 7 return JsonResponse(serializer.validated_data) 8 print('错误信息', serializer.errors) 9 # 错误信息 {'age': [ErrorDetail(string='老女人', code='invalid')]} 10 return JsonResponse({'error': '校验失败'})
局部校验
1 from rest_framework import serializers 2 from student import models 3 class StudentModelSerializer(serializers.ModelSerializer): 4 class Meta: 5 model = models.Student # 与Student表对应 6 # fields = '__all__' 7 fields = ['name', 'age'] 8 # 局部钩子 9 def validate_name(self, data): 10 if '66' in data: 11 raise serializers.ValidationError('您的名字不合法呀') 12 return data
全局校验
全局校验在所有的校验之后, data是所有校验完成后返回的一个有序字典
注意: validate和class Meta 是同一级的
class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = models.Student # 与Student表对应 # fields = '__all__' fields = ['name', 'age'] # 全局钩子 def validate(self, data): print(data) # OrderedDict([('name', '加藤66'), ('age', 12)]) name = data.get('name') if '6' in name: raise serializers.ValidationError('您的名字不合法呀') return data
本文来自博客园,作者:长情不羁的五年,转载请注明原文链接:https://www.cnblogs.com/grlend/articles/14143398.html