Ответ 1
Используйте MinValueValidator
.
price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12, validators=[MinValueValidator(Decimal('0.01'))])
В моих моделях Django я создал такое десятичное поле:
price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12)
Очевидно, что нет никакого смысла, чтобы цена была отрицательной или нулевой. Есть ли способ ограничить десятичное число только положительными числами?
Или мне нужно сделать это с помощью проверки формы?
Используйте MinValueValidator
.
price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12, validators=[MinValueValidator(Decimal('0.01'))])
Вы можете сделать что-то вроде этого:
# .....
class priceForm(ModelForm):
price = forms.DecimalField(required=False, max_digits=6, min_value=0)
Это также отвечает за значение валидатора 'price'.
Согласно документам, кажется, что нет способа поставить что-то вроде ограничения базы данных в поле. Лучшее, что вы можете сделать, это добавить модели "валидаторы", которые будут вызываться, если вы вызываете проверку модели или используете ModelForm
. Валидаторы пропускаются, если вы просто добавляете значения в объект и save()
.
Итак, вы можете добавить валидацию в формы, или вы можете добавить валидацию к модели, которая также запускается на уровне формы, если вы используете ModelForm
.
Из docs в разделе "Как работают валидаторы" :
Более подробную информацию о том, как работают валидаторы, см. в форме проверкив формах и Проверка объектов для их использования в моделях. Заметка что валидаторы не будут запускаться автоматически при сохранении модели, но если вы используете
ModelForm
, он будет запускать ваши валидаторы на любом поля, которые включены в вашу форму. См. Документацию ModelFormдля получения информации о том, как валидация модели взаимодействует с формами.
В Django 2.2 вы можете добавить ограничения к модели, которые будут применяться при переносе в качестве ограничения к таблице базы данных:
from django.db import models
class Item(models.Model):
price = models.DecimalField( _(u'Price'), decimal_places=2, max_digits=12 )
class Meta:
constraints = [
models.CheckConstraint(check=models.Q(price__gt=Decimal('0')), name='price_gt_0'),
]
Validation of Constraints
Обычно ограничения не проверяются во время
full_clean()
и не повышаютValidationErrors
. Скорее вы получите ошибку целостности базы данных наsave()
.