Django имеет различные числовые поля, доступные для использования в моделях, например, DecimalField и PositiveIntegerField . Хотя первое может быть ограничено количеством сохраненных десятичных разрядов и общим количеством сохраненных символов, есть ли способ ограничить его сохранением только чисел в определенном диапазоне, например, 0,0-5,0?
В противном случае, есть ли способ ограничить PositiveIntegerField, чтобы хранить только, например, числа до 50?
Обновление: теперь, когда ошибка 6845 закрыта , этот вопрос StackOverflow может быть спорным. - сампаблокупер
python
django
django-models
numbers
sampablokuper
источник
источник
Ответы:
Вы также можете создать собственный тип поля модели - см. Http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields
В этом случае вы можете «унаследовать» от встроенного IntegerField и переопределить его логику проверки.
Чем больше я думаю об этом, тем больше понимаю, насколько это полезно для многих приложений Django. Возможно, тип IntegerRangeField мог бы быть представлен как патч для разработчиков Django, чтобы рассмотреть возможность добавления в trunk.
Это работает для меня:
Затем в своем классе модели вы бы использовали его следующим образом (поле является модулем, в который вы поместили вышеуказанный код):
ИЛИ для диапазона отрицательных и положительных значений (например, диапазона осциллятора):
Что было бы действительно круто, так это если бы его можно было вызвать с помощью оператора диапазона, например так:
Но это потребовало бы намного больше кода, поскольку вы можете указать параметр 'skip' - range (1, 50, 2) - Интересная идея, хотя ...
источник
MinValueValidator(min_value) and MaxValueValidator(max_value)
перед вызовомsuper().__init__ ...
(фрагмент: gist.github.com/madneon/147159f46ed478c71d5ee4950a9d697d )Вы можете использовать встроенные валидаторы Django -
Редактирование : при работе непосредственно с моделью обязательно вызовите метод model full_clean перед сохранением модели, чтобы активировать валидаторы. Это не требуется при использовании,
ModelForm
так как формы будут делать это автоматически.источник
null=True
иblank=True
работает как положено. Поле является необязательным, и если оно оставлено пустым, оно сохраняется как нулевое.источник
У меня была такая же проблема; вот мое решение:
источник
models.IntegerField(choices=[(i, i) for i in range(1, n)], blank=True)
Есть два способа сделать это. Одним из них является использование проверки формы, чтобы никогда не позволять пользователю вводить любое число свыше 50. Форма проверки документов .
Если в процессе не участвует ни один пользователь или вы не используете форму для ввода данных, вам придется переопределить метод модели,
save
чтобы сгенерировать исключение или ограничить ввод данных в поле.источник
Вот лучшее решение, если вам нужна дополнительная гибкость и вы не хотите менять поле модели. Просто добавьте этот пользовательский валидатор:
И это можно использовать как таковое:
Два параметра - это max и min, и это допускает нулевые значения. Вы можете настроить валидатор, если хотите, избавившись от отмеченного оператора if или изменив свое поле на пустое = False, null = False в модели. Это, конечно, потребует миграции.
Примечание: мне пришлось добавить валидатор, потому что Django не проверяет диапазон на PositiveSmallIntegerField, вместо этого он создает smallint (в postgres) для этого поля, и вы получаете ошибку БД, если указанное число выходит за пределы диапазона.
Надеюсь, это поможет :) Подробнее о валидаторах в Django .
PS. Я основал свой ответ на BaseValidator в django.core.validators, но все иначе, кроме кода.
источник