Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MinValueValidator在Django中的DecimalField上不工作_Python_Django_Decimal_Django Rest Framework - Fatal编程技术网

Python MinValueValidator在Django中的DecimalField上不工作

Python MinValueValidator在Django中的DecimalField上不工作,python,django,decimal,django-rest-framework,Python,Django,Decimal,Django Rest Framework,我有一个使用Django和Django Rest框架开发的API。我有一个带有DecimalField的模型,它应该存储至少一个的值。因此,我用以下方式定义了该字段: goal = models.DecimalField(decimal_places=2, max_digits=16, validators=[MinValueValidator(1)]) 当我使用DRF的ModelViewSet创建调用API的对象时,我可以创建目标为负的对象,因此验证程序似乎不起作用,因为我已将其包含在模型序

我有一个使用Django和Django Rest框架开发的API。我有一个带有DecimalField的模型,它应该存储至少一个的值。因此,我用以下方式定义了该字段:

goal = models.DecimalField(decimal_places=2, max_digits=16, validators=[MinValueValidator(1)])
当我使用DRF的ModelViewSet创建调用API的对象时,我可以创建目标为负的对象,因此验证程序似乎不起作用,因为我已将其包含在模型序列化程序中


有什么想法吗?

只有在使用Django的ModelForm时,验证器才会自动运行。否则,您需要自己触发验证,通常是通过调用模型对象的full_clean方法


请参见

验证程序仅在使用Django的ModelForm时自动运行。否则,您需要自己触发验证,通常是通过调用模型对象的full_clean方法

请参见

这是Django REST framework 3.3.x的一部分。您可以通过降级到3.2.5或等待3.3.3发布(其中应包括修复)来临时修复问题

DRF目前正在过滤掉Django<1.9中的验证器,这就是为什么它没有实际运行。

这是Django REST framework 3.3.x的情况。您可以通过降级到3.2.5或等待3.3.3发布(其中应包括修复)来临时修复问题


DRF目前正在过滤Django<1.9中的验证器,这就是为什么它没有实际运行。

请注意,DRF实际上没有调用clean方法,这似乎是允许负值通过的原因。另外,如果重写clean方法,您可能应该调用super。请注意,clean方法实际上不是由DRF调用的,这似乎就是允许负值通过的原因。另外,如果您覆盖了clean方法,您可能应该调用super。谢谢!我用起亚的答案修补了它,但一旦这个问题得到解决,我想我可以删除它并像往常一样使用验证器。谢谢!我用起亚的答案修补了它,但一旦这个问题得到解决,我想我可以删除它并像往常一样使用验证器。
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.'))