Django如何写PositiveDecimalField

标签 django django-models django-validation

我想写 PositiveDecimalField。

这是我的代码:

from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _

from django.db.models import DecimalField
from decimal import *

def validate_positive_decimal(value):
    try:
        decimal_value = Decimal(value)

        if decimal_value < 0:
            raise ValidationError(_('{val} should be a positive decimal number'.format(val = decimal_value)), code='negative decimal')

    except (ValueError, TypeError):
        raise ValidationError(_('Enter a valid decimal or integer value'), code='invalid decimal')


class PositiveDecimalField(DecimalField):
    default_validators = [validate_positive_decimal]

    def __init__(self, *args, **kwargs):

        super(DecimalField, self).__init__(*args, **kwargs)

    def validators(self):
        return super(PositiveDecimalField, self).validators + [validate_positive_decimal]

然后,在我的 models.py 中

class Service(models.Model):
    service_rate = PositiveDecimalField(max_digits = 6, decimal_places=2, blank=True) # e.g. 125.25 for water (demo phase), -125.25 should not be accepted

我得到的错误是这样的:

super(DecimalField, self).__init__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'max_digits'

我在文档中查看了 Django 的 DecimalField 的源代码。我还尝试将验证器 validate_positive_decimal 传递给 DecimalField,但它不会对其进行验证。

我需要在这里做什么?

最佳答案

我通常定义这样的字段:

from django.core.validators import MinValueValidator

pos_float_field = models.FloatField(validators=[MinValueValidator(0.0)])

这样更干净。

文档:MinValueValidator

关于Django如何写PositiveDecimalField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38227128/

相关文章:

python - 计算外键关系中出现的次数

python - 在 include 中使用命名空间有什么意义? ( Django 2.0)

python - django 模型中使用 HTML 装饰字段

django - 如何将 Django 模拟实例传递给类方法?

ModelForm 的 Django TextField max_length 验证

python - 使用 Django/Python 在 Heroku 上自定义字体

python - 由于 COMMAND_LINE_LOGGING_LEVEL 无法导入 Markdown

Django REST Framework - 组合和分页多个模型

python - Django--表单验证(为什么我不能手动清理一个Integer Form Field)

django - 如何在 Django Rest Framework(DRF)中为 ModelSerializers 编写自定义字段验证,类似于 Django 中的表单验证?