![見出し画像](https://assets.st-note.com/production/uploads/images/12216242/rectangle_large_type_2_ee6c1cd27671297676d77fc6af330dac.png?width=1200)
Photo by
dngri
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)
今回はシンプルな数値の範囲を限定するためのバリデーションを作っただけですが、カスタムフィールドを使えば細かい指定などが可能になります。
参考資料
この記事が気に入ったらサポートをしてみませんか?