1. 程式人生 > 其它 >DRF之欄位驗證

DRF之欄位驗證

欄位驗證一般在反序列化時會有,即接收客戶端傳送過來的資料,進行驗證,再進行儲存

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 排除欄位的校驗。