如何在没有任何表单的情况下验证Django模型的构造函数参数?

30 浏览
0 Comments

如何在没有任何表单的情况下验证Django模型的构造函数参数?

这是我的简单Django类:

class MyClass(models.Model):
    my_field1 = models.IntegerField(null=False, blank=False) 
    # 我想要插入验证规则,即当 my_field1 > 10 时,my_field2 = True
    my_field2 = models.BooleanField(null=False, blank=False)

我想要插入验证规则,即当 `my_field1 > 10` 时,`my_field2 = True`。如果用户输入违反该约束的数据,我希望构造函数引发异常。

#MyClass.object.create(9, False)     # 应该成功
#MyClass.object.create(11, True)     # 应该成功
#MyClass.object.create(31, True)     # 应该成功
#MyClass.object.create(8, True)      # 应该引发异常
#MyClass.object.create(21, False)    # 应该引发异常

我该如何做?我所读到的有关Django验证的所有内容都发生在模型表单中。但是我的应用程序没有表单。我需要在模型本身中进行验证。我该如何实现?

0
0 Comments

问题的出现原因是:Django提供了模型验证选项,但默认情况下不会自动触发验证,因此需要重写模型的save()方法来调用clean/full_clean方法进行验证。

解决方法是:重写模型的save()方法,在其中调用full_clean()方法进行验证,然后再调用父类的save()方法保存数据。

具体代码如下:

def save(self, *args, **kwargs):
    self.full_clean()
    super(MyClass, self).save(*args, **kwargs)

这样,在保存模型对象之前,会自动调用full_clean()方法对模型的参数进行验证,确保数据的有效性。

0
0 Comments

在Django模型中验证构造函数参数时,如何在没有任何表单的情况下进行验证?

问题的原因是作者想要实现更复杂的自定义验证,而不仅仅是简单的最小和最大值验证。作者还希望自定义验证能够使用传入的其他参数的值。

解决方法是使用自定义验证器,并重写保存函数。可以在Django文档中找到关于自定义验证器的更多信息。

以下是解决方法的示例代码:

from django.db import models
from django.core.validators import MinValueValidator
class MyClass(models.Model):
    my_field1 = models.IntegerField(
        validators=[MinValueValidator(11)]
    )
    def save(self, *args, **kwargs):
        # 在保存前进行自定义验证
        if self.my_field1 > 100:
            raise ValueError("my_field1 must be less than or equal to 100")
        
        super().save(*args, **kwargs)

通过重写保存函数,我们可以在保存前进行自定义验证。在这个例子中,如果`my_field1`的值大于100,将会抛出一个值错误。

这样,我们就可以在Django模型中实现自定义的构造函数参数验证,而不需要使用任何表单。

0
0 Comments

问题的出现原因是需要对Django模型的构造函数参数进行验证,但是不想使用表单。

解决方法是可以通过附加一个`pre_save`信号,并检查这两个值是否满足约束条件。下面是一个示例代码:

from django.core.exceptions import ValidationError
from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save, sender=MyClass)
def model_pre_save(sender, instance, **kwargs):
    if ((instance.my_field1 >= 10 and not instance.my_field2) or
        (instance.my_field1 < 10 and instance.my_field2)):
        raise ValidationError('Validation error: {}'.format(instance))

在这个示例中,我们定义了一个`pre_save`信号接收器`model_pre_save`,并将其连接到`MyClass`模型的`pre_save`信号上。在接收器中,我们检查了`my_field1`和`my_field2`的值是否满足约束条件,如果不满足,则抛出一个`ValidationError`异常。

这样,当我们保存一个`MyClass`实例时,`pre_save`信号将被触发,然后执行`model_pre_save`接收器中的代码进行验证。如果验证失败,则会抛出异常,阻止保存操作。这样就实现了对构造函数参数的验证,而不需要使用表单。

0