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

Разрешить только положительные десятичные числа

В моих моделях Django я создал такое десятичное поле:

price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12)

Очевидно, что нет никакого смысла, чтобы цена была отрицательной или нулевой. Есть ли способ ограничить десятичное число только положительными числами?

Или мне нужно сделать это с помощью проверки формы?

4b9b3361

Ответ 1

Используйте MinValueValidator.

price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12, validators=[MinValueValidator(Decimal('0.01'))])

Ответ 2

Вы можете сделать что-то вроде этого:

# .....
class priceForm(ModelForm):
    price = forms.DecimalField(required=False, max_digits=6, min_value=0)

Это также отвечает за значение валидатора 'price'.

Ответ 3

Согласно документам, кажется, что нет способа поставить что-то вроде ограничения базы данных в поле. Лучшее, что вы можете сделать, это добавить модели "валидаторы", которые будут вызываться, если вы вызываете проверку модели или используете ModelForm. Валидаторы пропускаются, если вы просто добавляете значения в объект и save().

Итак, вы можете добавить валидацию в формы, или вы можете добавить валидацию к модели, которая также запускается на уровне формы, если вы используете ModelForm.

Из docs в разделе "Как работают валидаторы" :

Более подробную информацию о том, как работают валидаторы, см. в форме проверкив формах и Проверка объектов для их использования в моделях. Заметка что валидаторы не будут запускаться автоматически при сохранении модели, но если вы используете ModelForm, он будет запускать ваши валидаторы на любом поля, которые включены в вашу форму. См. Документацию ModelFormдля получения информации о том, как валидация модели взаимодействует с формами.

Ответ 4

В 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().