MinValueValidator 不在 Django 中的 DecimalField 上工作
MinValueValidator not working on DecimalField in Django
我有一个 API 是用 Django 和 Django Rest Framework 开发的。我有一个带有 DecimalField 的模型,它应该至少存储一个值。因此,我按以下方式定义了该字段:
goal = models.DecimalField(decimal_places=2, max_digits=16, validators=[MinValueValidator(1)])
当我创建调用 API 的对象时(使用 DRF 的 ModelViewSet),我可以创建具有负数 "goal" 的对象,所以验证器似乎不起作用(我已经包含了它在模型序列化器中)。
有什么想法吗?
当使用 Django 的 ModelForm
时,验证器只会自动 运行。否则,您需要自己触发验证,通常是调用模型对象的 full_clean()
方法。
见https://docs.djangoproject.com/en/1.9/ref/validators/#how-validators-are-run
from django.db import models
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
class MyModel(models.Model):
goal = models.DecimalField(decimal_places=2, max_digits=16,
validators=[MinValueValidator(1)])
def clean(self):
if self.goal < 1:
raise ValidationError(_('Only numbers equal to 1 or greater are accepted.'))
这是 a known bug 与 Django REST 框架 3.3.x。您可以通过降级到 3.2.5 或等待 3.3.3 发布(应该包括修复)暂时 "fix" 这个问题。
DRF 目前正在过滤掉 Django < 1.9 中的验证器,这就是为什么它实际上不是 运行。
我有一个 API 是用 Django 和 Django Rest Framework 开发的。我有一个带有 DecimalField 的模型,它应该至少存储一个值。因此,我按以下方式定义了该字段:
goal = models.DecimalField(decimal_places=2, max_digits=16, validators=[MinValueValidator(1)])
当我创建调用 API 的对象时(使用 DRF 的 ModelViewSet),我可以创建具有负数 "goal" 的对象,所以验证器似乎不起作用(我已经包含了它在模型序列化器中)。
有什么想法吗?
当使用 Django 的 ModelForm
时,验证器只会自动 运行。否则,您需要自己触发验证,通常是调用模型对象的 full_clean()
方法。
见https://docs.djangoproject.com/en/1.9/ref/validators/#how-validators-are-run
from django.db import models
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
class MyModel(models.Model):
goal = models.DecimalField(decimal_places=2, max_digits=16,
validators=[MinValueValidator(1)])
def clean(self):
if self.goal < 1:
raise ValidationError(_('Only numbers equal to 1 or greater are accepted.'))
这是 a known bug 与 Django REST 框架 3.3.x。您可以通过降级到 3.2.5 或等待 3.3.3 发布(应该包括修复)暂时 "fix" 这个问题。
DRF 目前正在过滤掉 Django < 1.9 中的验证器,这就是为什么它实际上不是 运行。