1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Django REST framework] サクッと理解!!!!!!serializerでの簡単なバリデーションについて!!!

Posted at

この記事の目的

サクッとDjango REST frameworkにおけるシリアライザでのバリデーションがわかる

早速やってみよう

以下はカスタマーモデルの例です。

models.py
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 = "顧客"

以下は本題のカスタマーモデルのシリアライザです。

serializers.py
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では多種多様なバリデーションが組めるみたいなので色々試してみてください!🐰

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?