2012-05-10 24 views
36

私はいくつかの浮動小数点データをDjangoモデルに保存していますが、ある範囲の値だけが意味があります。したがって、私はモデルとSQLの両方の制約レベルでこれらの制限を課したいと思います。例えば最大限と最小限のDjango FloatFieldの作成方法は?

、私はこのような何かをしたいと思います:

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

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

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

答えて

11

フォームレベルの制約が必要な場合は、min_value渡すことができますし、max_valueform fieldに:あなたはレベルをモデル化するために、それを上に移動する必要がある場合

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) 
+0

OK。そして、MinMaxFloatを拡張して、それらの値に対して実際に検証し、データベースの制約を作成するのは私の責任ですか? – Reid

+0

djangoモデルレベルで制約を作成します。つまり 'Foo(myfloat = -1.0).save()'のように手動でレコードを挿入できますが、 'Foo'モデルに基づいて' ModelForm'を送信しようとするとValidationError – San4ez

71

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

from django.core.validators import MaxValueValidator, MinValueValidator 

... 
weight = models.FloatField(
    validators = [MinValueValidator(0.9), MaxValueValidator(58)]) 

私はカントー、それはSQLの制約を追加するとは思いません。