202

Djangoには、 DecimalFieldPositiveIntegerFieldなど、モデルで使用できるさまざまな数値フィールドがあります。前者は、格納される小数点以下の桁数と格納される文字の総数に制限できますが、特定の範囲(たとえば、0.0〜5.0)内の数値のみを格納するように制限する方法はありますか?

それができない場合、PositiveIntegerFieldを制限して、たとえば50までの数値のみを格納する方法はありますか?

更新:バグ6845が閉じられたので、このStackOverflowの質問は議論の余地があるかもしれません。--sampablokuper

4

7 に答える 7

445

Django の組み込みバリデーターを使用できます—</p>

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

class CoolModelBro(Model):
    limited_integer_field = IntegerField(
        default=1,
        validators=[
            MaxValueValidator(100),
            MinValueValidator(1)
        ]
     )

編集:モデルを直接操作する場合は、バリデーターをトリガーするために、モデルを保存する前に必ずモデルのfull_cleanメソッドを呼び出してください。ModelFormフォームが自動的に行うため、使用時にはこれは必要ありません。

于 2012-08-19T13:32:39.440 に答える
102
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

size = models.IntegerField(validators=[MinValueValidator(0),
                                       MaxValueValidator(5)])
于 2012-08-19T13:54:25.240 に答える
57

これとまったく同じ問題がありました。ここに私の解決策がありました:

SCORE_CHOICES = zip( range(1,n), range(1,n) )
score = models.IntegerField(choices=SCORE_CHOICES, blank=True)
于 2010-10-28T21:38:25.917 に答える
5

追加の柔軟性が必要で、モデル フィールドを変更したくない場合は、これが最適なソリューションです。このカスタムバリデーターを追加するだけです:

#Imports
from django.core.exceptions import ValidationError      

class validate_range_or_null(object):
    compare = lambda self, a, b, c: a > c or a < b
    clean = lambda self, x: x
    message = ('Ensure this value is between %(limit_min)s and %(limit_max)s (it is %(show_value)s).')
    code = 'limit_value'

    def __init__(self, limit_min, limit_max):
        self.limit_min = limit_min
        self.limit_max = limit_max

    def __call__(self, value):
        cleaned = self.clean(value)
        params = {'limit_min': self.limit_min, 'limit_max': self.limit_max, 'show_value': cleaned}
        if value:  # make it optional, remove it to make required, or make required on the model
            if self.compare(cleaned, self.limit_min, self.limit_max):
                raise ValidationError(self.message, code=self.code, params=params)

そして、それは次のように使用できます:

class YourModel(models.Model):

    ....
    no_dependents = models.PositiveSmallIntegerField("How many dependants?", blank=True, null=True, default=0, validators=[validate_range_or_null(1,100)])

2 つのパラメーターは max と min で、null を許可します。必要に応じて、マークされた if ステートメントを削除してバリデーターをカスタマイズするか、モデルでフィールドを blank=False、null=False に変更できます。もちろん、それには移行が必要です。

注: Django は PositiveSmallIntegerField の範囲を検証しないため、バリデーターを追加する必要がありました。代わりに、このフィールドに対して (postgres で) smallint を作成し、指定された数値が範囲外の場合は DB エラーが発生します。

これが役立つことを願っています:) Djangoのバリデーターの詳細。

PS。django.core.validators の BaseValidator に基づいて回答しましたが、コードを除いてすべてが異なります。

于 2014-09-17T20:45:53.383 に答える