自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

【Django】モデルフィールドに正規表現によるバリデーションを指定する【カラーコード・電話番号に有効】

thumbnail

例えば、Djangoで電話番号や16進数カラーコード、郵便番号や金融機関コードなどの、桁数と使用文字の種類が決まったデータをモデルフィールドに挿入する時、どうしていますか?

CharFieldやIntegerFieldにそのまま入れる?フロント側で対策しているから大丈夫?そんなわけない。不適切なデータがDBに入った時点で、システムは破綻する。それは世の常。

そこで、本記事ではモデルに正規表現のバリデーションを実装させることで、DBに不適切なデータを挿入させないようにする方法を解説する。

models.pyにRegexValidatorを実装

django.core.validators.RegexValidatorを使用する。以下、models.pyのコード。名前とテーマカラーを記録するモデルクラスである。

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

class Profile(models.Model):
    class Meta:
        db_table    = "profile"

    id          = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name        = models.CharField(verbose_name="名前",max_length=50)

    color_regex = RegexValidator(regex=r'^#(?:[0-9a-fA-F]{3}){1,2}$')
    color       = models.CharField(verbose_name="テーマ色",max_length=7,validators=[color_regex],default="#000000")

    def __str__(self):
        return self.name

color_regexはただの正規表現バリデーションが入った変数。正規表現はカラーコードを意味する#から始まり、16進数を意味する0~9とa~f(A~F)までの値が3つか6つ続く文字列を判定する。

colorは文字列型フィールドに、バリデーションとしてcolor_regexを採用している。validators属性にリスト型として正規表現を与える。

後はこれをマイグレーションしてDBに反映させる。これだけでカラーコードに合致するデータのみをDBに記録してくれる。

結論

ちなみに、IPアドレスは正規表現なんて使わなくても、専用のGenericIPAddressFieldなるものがある。IPv4とIPv6両対応なので正規表現には真似できない。公式リファレンスに書かれてある。

https://docs.djangoproject.com/en/3.1/ref/models/fields/#genericipaddressfield

また、EmailFieldなんてものもある。

https://docs.djangoproject.com/en/3.1/ref/models/fields/#emailfield

スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ