2012-05-10 1 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_value к form 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()', но вы получите ValidationError при попытке отправить 'ModelForm' на основе вашей модели' Foo' – San4ez

71

Ответы до сих пор описывают, как сделать проверки форм. Вы также можете поместить валидаторы в модель. Используйте MinValueValidator и MaxValueValidator.

Например:

from django.core.validators import MaxValueValidator, MinValueValidator 

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

Я не думаю, что добавляет ограничения SQL, Тхо.

Смежные вопросы