見出し画像

Djangoのモデルで数値の範囲を限定するカスタムフィールドを作成する

Djangoのモデルにはカスタムフィールドという機能があり、モデルに定義するフィールドをカスタマイズすることが可能です。

今回は仕事で使う機会もあったため、自分用のメモも兼ねてカスタムフィールドを簡潔にまとめてみました。

モデルのフィールドにバリデーションを加える

以下のようなシンプルなモデルがあるとします。nameとabilityという二つのフィールドがあるだけのシンプルなモデルです。

abilityフィールドのオプションにvalidatorsというのがあり、リストの中にMinValueValidator, MaxValueValidatorの二つが埋め込まれています。

abilityフィールドは1以上、1000以下の値を受け付けます。今回はここの部分をカスタムフィールドにしてみます。

from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator

class Human(models.Model):
   name = models.CharField(max_length=100)
   ability = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(1000)])

カスタムフィールドを作成する

上記のHumanモデルを元にAbilityRangeFieldというカスタムフィールドを作成します。AbilityRangeFieldはIntegerField型を継承したクラスです。

以下のようにabilityフィールドが上記と変わっているのがわかると思います。

from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator


class AbilityRangeField(models.IntegerField):
   def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
       self.min_value, self.max_value = min_value, max_value
       models.IntegerField.__init__(self, verbose_name, name, **kwargs)

   def formfield(self, **kwargs):
       defaults = {'min_value': self.min_value, 'max_value':self.max_value}
       defaults.update(kwargs)
       return super(IntegerRangeField, self).formfield(**defaults)


class Human(models.Model):
   name = models.CharField(max_length=100)
   ability = AbilityRangeField(min_value=1, max_value=100)

今回はシンプルな数値の範囲を限定するためのバリデーションを作っただけですが、カスタムフィールドを使えば細かい指定などが可能になります。

参考資料


この記事が気に入ったらサポートをしてみませんか?