2012-05-10 22 views
36

Estoy almacenando algunos datos de coma flotante en mis modelos de Django, y solo un cierto rango de valores es significativo. Por lo tanto, me gustaría imponer estos límites tanto en el modelo como en el nivel de restricción de SQL.¿Cómo crear un Django FloatField con límites máximos y mínimos?

Por ejemplo, me gustaría hacer algo como esto:

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

quiero hacer esto a nivel de modelo, no el nivel de formulario. De hecho, me gustaría que el nivel del formulario tenga un rango diferente; Por ejemplo, use porcentajes [0,100] en el nivel del formulario pero se traduce a [0,1] en el modelo.

¿Es esto posible, y si es así, cómo voy a hacerlo?

Respuesta

11

Si necesita limitación en el nivel de forma que puede pasar min_value y max_value a form field:

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

Pero si usted necesita para moverlo hasta el modelo nivel hay que extender la base de models.FloatField clase

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) 

Entonces se puede usar en los modelos

class Foo(models.Model): 
    myfloat = MinMaxFloat(min_value=0.0, max_value=1.0) 
+0

OK. Y luego, extender el MinMaxFloat para realmente validar contra esos valores y crear restricciones de bases de datos, ¿depende de mí? – Reid

+0

Crea una restricción en el nivel de modelo django, es decir, puede insertar registros manualmente como 'Foo (myfloat = -1.0) .save()', pero obtendrá ValidationError cuando intente enviar 'ModelForm' en función de su modelo' Foo' – San4ez

71

Las respuestas hasta ahora describen cómo hacer que los formularios validen. También puedes poner validadores en el modelo. Use MinValueValidator y MaxValueValidator.

Por ejemplo:

from django.core.validators import MaxValueValidator, MinValueValidator 

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

no creo que se suma las limitaciones de SQL, aunque.

Cuestiones relacionadas