DRF之欄位驗證
阿新 • • 發佈:2022-05-10
欄位驗證一般在反序列化時會有,即接收客戶端傳送過來的資料,進行驗證,再進行儲存
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 排除欄位的校驗。