85

Django モデルにいくつかの浮動小数点データを格納していますが、特定の範囲の値のみが意味を持ちます。したがって、モデルと SQL 制約レベルの両方でこれらの制限を課したいと思います。

たとえば、次のようなことをしたいと思います。

class Foo(Model):
   myfloat = FloatField(min=0.0, max=1.0)

フォームレベルではなく、モデルレベルでこれを行いたいです。実際、フォーム レベルに別の範囲を持たせたいと思うかもしれません。たとえば、フォーム レベルではパーセンテージ [0,100] を使用しますが、モデルでは [0,1] に変換します。

これは可能ですか?もしそうなら、どうすればいいですか?

4

3 に答える 3

150

これまでの回答は、フォームを検証する方法を説明しています。モデルにバリデーターを配置することもできます。MinValueValidatorMaxValueValidatorを使用します。

例えば:

from django.core.validators import MaxValueValidator, MinValueValidator

...
weight = models.FloatField(
    validators=[MinValueValidator(0.0), MaxValueValidator(1.0)],
)

編集

ただし、SQL 制約は追加されません。

ここCheckConstraintの sとして説明されているように、SQL 制約を追加できますMeta.constraints

結合例:

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

class Foo(Model):
    myfloat = FloatField(min=0.0, max=1.0,
        # for checking in forms
        validators=[MinValueValidator(0.0), MaxValueValidator(1.0)],)

    class Meta:
        constraints = (
            # for checking in the DB
            CheckConstraint(
                check=Q(myfloat__gte=0.0) & Q(myfloat__lte=1.0),
                name='foo_myfloat_range'),
            )
于 2012-05-27T17:55:07.490 に答える
22

フォーム レベルで制約が必要な場合は、フォーム フィールドmin_valueにおよびmax_valueを渡すことができます。

myfloat = forms.FloatField(min_value=0.0, max_value=1.0)

ただし、モデル レベルに移動する必要がある場合は、基本models.FloatFieldクラスを拡張する必要があります。

class MinMaxFloat(models.FloatField):
    def __init__(self, min_value=None, max_value=None, *args, **kwargs):
        self.min_value, self.max_value = min_value, max_value
        super(MinMaxFloat, self).__init__(*args, **kwargs)

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

その後、モデルで使用できます

class Foo(models.Model):
    myfloat = MinMaxFloat(min_value=0.0, max_value=1.0)
于 2012-05-10T18:03:05.840 に答える