【Django】電話番号/郵便番号に適したModelを作る


Django単体でアプリケーションを作るときはformの方でバリデーションかければいいのかもしれないけれど、Django REST FrameworkとしてAPIの提供を主とする場合、Modelの方でもバリデーションかけたい
以下は電話番号と郵便番号のフィールドに対してバリデーションをかけている例

models.py
from django.db import models
from django.core.validators import RegexValidator

class SampleModel(model.model):
    tel_number_regex = RegexValidator(regex=r'^[0-9]+$', message = ("Tel Number must be entered in the format: '09012345678'. Up to 15 digits allowed."))
    tel_number = models.CharField(validators=[tel_number_regex], max_length=15, verbose_name='電話番号')
    postal_code_regex = RegexValidator(regex=r'^[0-9]+$', message = ("Postal Code must be entered in the format: '1234567'. Up to 7 digits allowed."))
    postal_code = models.CharField(validators=[postal_code_regex], max_length=7, verbose_name='郵便番号') 

このようにすると、正規表現でバリデーションをかけることができる
マッチしないリクエストを送信した場合、それぞれに設定したmessageが返る

ハイフンをつけてレコードを保存したい場合などは、それに適した正規表現をregex=のところに書くと良いです

余談としては本当はそれぞれの正規表現を定義したところでmax_lengthも設定できればよかったんだけれど、それはできなかった