如何在没有任何表单的情况下验证Django模型的构造函数参数?
如何在没有任何表单的情况下验证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验证的所有内容都发生在模型表单中。但是我的应用程序没有表单。我需要在模型本身中进行验证。我该如何实现?
问题的出现原因是: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()方法对模型的参数进行验证,确保数据的有效性。
在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模型中实现自定义的构造函数参数验证,而不需要使用任何表单。
问题的出现原因是需要对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`接收器中的代码进行验证。如果验证失败,则会抛出异常,阻止保存操作。这样就实现了对构造函数参数的验证,而不需要使用表单。