如何在 Django 中验证模型 clean 方法中的多个字段

use*_*095 0 django django-models django-validation

在我的 Django 模型中,我使用clean()方法来验证两组字段的值。我用相同的方法容纳这两个条件clean()。但是我发现系统检查了第一个条件,而忽略了第二个条件。

这是我的模型和字段:

class Rates(models.Model):
    master_doc = models.ForeignKey(Origin, ...
    exit_rate = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True, default=0.00)
    from_date = models.DateField(null=True, verbose_name='From date')
    to_date = models.DateField(null=True, verbose_name='To date')

    def clean(self):
        if self.exit_rate <= 0:
            raise ValidationError({'exit_rate': _('The exit rate must be more than 0.')})
        if self.from_date is not None:
            if (self.to_date == self.from_date):
                raise ValidationError({'to_date': _('From Date and end date may not be the same.')})
Run Code Online (Sandbox Code Playgroud)

在这种情况下,仅针对第一个 ie 字段引发验证错误exit_rate如果我颠倒检查的顺序,则仅针对日期字段(而不是费率字段)引发验证错误。

我尝试了这个解决方案并使用error_dict但出现错误'ValidationError' object has no attribute 'error_list'

如何确保在不满足任一条件的情况下引发验证错误?

nig*_*222 6

您需要首先测试所有条件,然后引发一个包含多条消息的异常。就像是

def clean(self):
    errors={}
    if self.exit_rate <= 0:
        errors['exit_rate']= _('The exit rate must be more than 0.')
    if self.from_date is not None:
        if (self.to_date == self.from_date):
            errors['to_date'] = _('From Date and end date may not be the same.')
    if errors:
        raise ValidationError(errors)
Run Code Online (Sandbox Code Playgroud)

raise ValidationError( things)我无法立即找到传递多个错误的确切形式的引用。以上是基于原始问题中的 raise 语句的明显扩展的猜测。