Python 如何在没有任何表单的情况下验证Django模型的构造函数参数?
这是我简单的Django类:Python 如何在没有任何表单的情况下验证Django模型的构造函数参数?,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,这是我简单的Django类: class MyClass(models.Model): my_field1 = models.IntegerField(null=False,blank=False,) # I want to insert validation rule such that my_field2 = True iff my_field1 > 10 my_field2 = models.BooleanField(null=False, blank=F
class MyClass(models.Model):
my_field1 = models.IntegerField(null=False,blank=False,)
# I want to insert validation rule such that my_field2 = True iff my_field1 > 10
my_field2 = models.BooleanField(null=False, blank=False,)
我希望插入验证规则,以便在my_field1>10时my_field2=True。如果用户输入的数据违反了该约束,我希望构造函数引发异常
#MyClass.object.create(9, False) # Should Succeed
#MyClass.object.create(11, True) # Should Succeed
#MyClass.object.create(31, True) # Should Succeed
#MyClass.object.create(8, True) # Should Throw exception
#MyClass.object.create(21, False) # Should Throw exception
我怎么做?我所读到的关于django验证的所有内容都以模型形式出现。但是我的申请没有表格。我需要模型本身的验证。我该怎么做呢?跟着答案走。我想你正在寻找这样的东西:
from django.db import models
from django.core.validators import MinValueValidator
class MyClass(models.Model):
my_field1 = IntegerField(
validators=[MinValueValidator(11)]
)
Django提供的选项只有一个:默认情况下它们不会触发,因此您必须重写模型的save方法来调用clean/full_clean,如下所示:
您可以附加一个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))
为什么不使用表单层? 您可以将表单层仅用作验证层,这意味着不要将其用于呈现HTML。 即使在JSON API或AJAX上,使用表单层也是非常常见的 例如,您可以使用以下表单:
def my_ajax_view(request, pk):
ret = {'success': False, 'errors': []}
instance = get_object_or_404(MyModel, pk=pk)
f = ModelUpdateForm(request.POST, instance=ins)
if f.is_valid():
#your code
ret['success'] = True
return JSONResponse(ret)
ret['errors'] = serialize_form_errors(f) #not in django
return JSONResponse(ret)
另一种方法可以是重新实现save方法,如@tom的评论所述
谢谢 看一看。看一看Pynchia,这并不能解决问题,因为当我执行MyClass.object.createYou是对的,这正是我想要的。然而,这展示了如何进行简单的最小值和最大值验证。我想做更复杂的事情。如何进行自定义验证?它必须使用发送的其他参数的值,如我的原始问题中所述。听起来你想编写一个自定义验证器。您可以在这里了解它们:EricBulloch,但是这些自定义验证器可以基于进入构造函数的其他字段的值进行验证吗?从您发布的链接来看,情况似乎并非如此。@SaqibAli根据链接,保存模型时不会运行验证程序。看起来您还必须执行类似于覆盖save函数的操作。
def my_ajax_view(request, pk):
ret = {'success': False, 'errors': []}
instance = get_object_or_404(MyModel, pk=pk)
f = ModelUpdateForm(request.POST, instance=ins)
if f.is_valid():
#your code
ret['success'] = True
return JSONResponse(ret)
ret['errors'] = serialize_form_errors(f) #not in django
return JSONResponse(ret)