Как создать Django FloatField с максимальными и минимальными пределами?
Я храню некоторые данные с плавающей запятой в своих моделях Django, и только определенный диапазон значений имеет смысл. Поэтому я бы хотел наложить эти ограничения как на уровне модели, так и на уровне SQL.
Например, я хотел бы сделать что-то вроде этого:
class Foo(Model):
myfloat = FloatField(min=0.0, max=1.0)
Я хочу сделать это на уровне модели, а не на уровне формы. Фактически, мне может понравиться, чтобы уровень формы имел другой диапазон; например, использовать проценты [0,100] на уровне формы, но перевести на [0,1] в модели.
Возможно ли это, и если да, то как мне это сделать?
Ответы
Ответ 1
Ответы до сих пор описывают, как сделать проверки форм. Вы также можете поместить валидаторы в модель. Используйте MinValueValidator и MaxValueValidator.
Например:
from django.core.validators import MaxValueValidator, MinValueValidator
...
weight = models.FloatField(
validators = [MinValueValidator(0.9), MaxValueValidator(58)])
Я не думаю, что добавляет ограничения SQL, tho.
Ответ 2
Если вам нужно ограничение на уровне формы, вы можете передать min_value
и max_value
в поле формы:
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)