2012-05-10 12 views
36

Ich speichere Gleitkommadaten in meinen Django-Modellen und nur ein bestimmter Wertebereich ist sinnvoll. Daher möchte ich diese Grenzwerte sowohl auf der Ebene der Modelle als auch auf der SQL-Ebene festlegen.Wie erstelle ich ein Django FloatField mit maximalen und minimalen Grenzen?

Zum Beispiel würde Ich mag so etwas tun:

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

ich dies auf Modellebene tun will, nicht Formularebene. In der Tat könnte es mir gefallen, dass die Formularebene einen anderen Bereich hat; Verwenden Sie z. B. Prozentsätze [0,100] auf der Formularebene, aber übersetzen Sie sie in [0,1] im Modell.

Ist das möglich, und wenn ja, wie würde ich es tun?

Antwort

11

Wenn Sie Einschränkung auf Formularebene benötigen, können Sie min_value und max_value-form field passieren:

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

Aber wenn Sie es verschieben müssen Sie das Niveau zu modellieren haben Sie die Basis models.FloatField Klasse erweitern

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) 

Dann können Sie es in Modellen verwenden

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

OK. Und dann würde ich die MinMaxFloat erweitern, um diese Werte zu validieren und Datenbankbeschränkungen zu erstellen. – Reid

+0

Es erstellt Constraint auf Django-Modell-Ebene, d. H. Sie können Datensatz wie 'Foo (myfloat = -1.0) .save()' manuell einfügen, aber Sie erhalten ValidationError, wenn Sie 'ModelForm' basierend auf Ihrem' Foo'-Modell senden – San4ez

71

Die bisherigen Antworten beschreiben, wie Formulare validiert werden können. Sie können auch Validatoren in das Modell einfügen. Verwenden Sie MinValueValidator und MaxValueValidator.

Zum Beispiel:

from django.core.validators import MaxValueValidator, MinValueValidator 

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

Ich glaube nicht, dass SQL-Constraints fügt hinzu, tho.

Verwandte Themen