Подтвердить что ты не робот

Как создать Django FloatField с максимальными и минимальными пределами?

Я храню некоторые данные с плавающей запятой в своих моделях Django, и только определенный диапазон значений имеет смысл. Поэтому я бы хотел наложить эти ограничения как на уровне модели, так и на уровне SQL.

Например, я хотел бы сделать что-то вроде этого:

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

Я хочу сделать это на уровне модели, а не на уровне формы. Фактически, мне может понравиться, чтобы уровень формы имел другой диапазон; например, использовать проценты [0,100] на уровне формы, но перевести на [0,1] в модели.

Возможно ли это, и если да, то как мне это сделать?

4b9b3361

Ответ 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)