この記事の目的
サクッとDjango REST frameworkにおけるシリアライザでのバリデーションがわかる
早速やってみよう
以下はカスタマーモデルの例です。
from django.db import models
from django_ulid.models import default, ulid
class Customer(models.Model):
id = models.CharField(
max_length=26, primary_key=True, default=ulid.new, editable=False
)
name = models.CharField(max_length=50, verbose_name="名前")
birth_of_date = models.DateField(verbose_name="生年月日")
phone_number = models.CharField(max_length=11, verbose_name="電話番号")
created_at = models.DateTimeField(auto_now_add=True, verbose_name="生成時刻")
class Meta:
verbose_name = "顧客"
verbose_name_plural = "顧客"
以下は本題のカスタマーモデルのシリアライザです。
import re
from datetime import date
from django.core.validators import RegexValidator
from rest_framework import serializers
from .models import Customer
class CustomerSerializer(serializers.ModelSerializer):
"""顧客情報用のシリアライザ"""
name = serializers.CharField(
max_length=50,
validators=[
RegexValidator(
regex=r"^[ぁ-んァ-ヶ一-龯]+$", message="名前は漢字、カタカナ、ひらがなで入力してください。"
)
],
)
phone_number = serializers.CharField(
max_length=11,
validators=[
RegexValidator(regex=r"^\d+$", message="電話番号は半角数字11桁で入力してください。")
],
)
def validate_birth_of_date(self, value):
if value >= date.today():
raise serializers.ValidationError("生年月日が未来日です。")
return value
class Meta:
model = Customer
fields = "__all__"
read_only_fields = ("id", "created_at")
実装しているバリデーション
nameのバリデーション
serializers.フィールドの型()とすることでバリデーション処理を記述できます。
今回は最大文字数とRegexValidatorを使用して正規表現によるバリデーションを行っています。
phone_numberのバリデーション
ここでも同様に最大文字数とRegexValidatorを実装しています。
validate_birth_of_dateのバリデーション
validate_birth_of_dateという独自のメソッドを定義しています。
このメソッドで、valueに渡された生年月日が今日よりも未来の日付であれば、serializers.ValidationErrorを発生させ、エラーメッセージを返します。
フィールドレベルのバリデーションとして
Serializerのサブクラスに.validate_メソッドを追加することで、フィールドレベルのカスタムバリデーションを指定することができます。
これは、Serializerのドキュメントに記載されています。
以下が参考になります。
Validation in REST framework Field-level validation
最後に
Django REST frameworkでは多種多様なバリデーションが組めるみたいなので色々試してみてください!🐰