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 中的验证器,这就是为什么它实际上不是 运行。