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

 

posted @ 2020-12-16 13:39  死里学  阅读(509)  评论(0)    收藏  举报