2012-05-10 20 views
36

Sto memorizzando alcuni dati in virgola mobile nei miei modelli Django, e solo un certo intervallo di valori è significativo. Pertanto, mi piacerebbe imporre questi limiti sia a livello di modello che a livello di vincoli SQL.Come creare un Django FloatField con limiti massimi e minimi?

Per esempio, mi piacerebbe fare qualcosa di simile:

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

voglio fare questo a livello di modello, non il livello di modulo. In effetti, mi piacerebbe che il livello del modulo avesse una gamma diversa; ad esempio, utilizzare le percentuali [0,100] a livello di modulo ma tradurre in [0,1] nel modello.

È possibile, e se sì, come potrei fare?

risposta

11

Se avete bisogno di vincolo a livello di modulo è possibile passare min_value e max_value-form field:

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

Ma se avete bisogno di spostare fino al modello di livello è necessario estendere la base di models.FloatField classe

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) 

Quindi è possibile utilizzarlo nei modelli

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

OK. Quindi estendere il MinMaxFloat per validare effettivamente tali valori e creare vincoli di database, spetterebbe a me? – Reid

+0

Crea un vincolo sul livello del modello django, cioè puoi inserire il record manualmente come 'Foo (myfloat = -1.0) .save()', ma otterrai ValidationError quando provi ad inviare 'ModelForm' basato sul tuo modello' Foo' – San4ez

71

Le risposte finora descrivono come convalidare i moduli. Puoi anche inserire i validatori nel modello. Utilizzare MinValueValidator e MaxValueValidator.

Ad esempio:

from django.core.validators import MaxValueValidator, MinValueValidator 

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

non credo che aggiunge vincoli SQL, tho.

Problemi correlati