DRF之字段验证

字段验证一般在反序列化时会有,即接收客户端传送过来的数据,进行验证,再进行保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from rest_framework import serializers
from teacher.models import Teacher
 
# 字段验证函数(只能单个字段验证)
def check_name(name):
    if name == "xxx":
        raise serializers.ValidationError("用户名中含有敏感名称")
    return name
 
# 字段验证函数(只能单个字段验证)
def check_name2(name):
    if "666" in name:
        raise serializers.ValidationError("用户名中不能有666")
    return name
 
 
class TeacherSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)
    # 设置read_only=True 可以忽略传过来的字段,不写入到数据库
    name = serializers.CharField(max_length=255,
                                 required=True,
                                 validators=[check_name,check_name2])
    # validators是个列表值,放入函数名可以从类体外引用函数进行验证,同时可以有多个函数验证
    sex = serializers.BooleanField(required=True)
    age = serializers.IntegerField(min_value=1, max_value=100, default=18)
    description = serializers.IntegerField(write_only=True)
    # 从数据库读出来的数据,序列化返回出来的时候,不显示某个字段,可以设置write_only=True
 
    # 字段验证方法
    # validate_字段名()   # 验证单个字段
    # validate()         # 验证所有字段
    def validate_name(self, name):
        exists = Teacher.objects.filter(name=name).exists()
        if exists:
            raise serializers.ValidationError("姓名不能重复")
        # 注意,每次验证完成以后必须有结果返回!否则数据就会丢失
        return name
 
    def validate(self, attrs):
        if attrs.get("name") == "乾隆" and attrs.get("sex") == True:
            raise serializers.ValidationError("别闹")
        return attrs
 
 
    class Meta:
        model = Teacher
        fields = "__all__"
        # exclude = ["字段名"]
        # 如果某个字段我们既不希望用户传到数据库,也不希望查询的时候显示给用户,那么可以用 exclude 排除字段的校验。

  

 

posted @   EricYJChung  阅读(320)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示