这是我简单的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=False,)
我想插入验证规则,my_field2
= True iff my_field1
> 10.如果用户输入违反该约束的数据,我希望构造函数引发异常。
#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验证的所有内容都发生在模型表单中。但我的申请没有表格。我需要在模型中进行验证。我怎么能这样做?
答案 0 :(得分:2)
回答here。我想你正在寻找这样的东西:
from django.db import models
from django.core.validators import MinValueValidator
class MyClass(models.Model):
my_field1 = IntegerField(
validators=[MinValueValidator(11)]
)
答案 1 :(得分:1)
您可以附加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))
答案 2 :(得分:0)
Django为Model Validation个选项提供了一个问题:默认情况下它们不会触发,因此您必须覆盖模型的save()
方法才能调用clean
/ full_clean
喜欢这样:
def save(self, *args, **kwargs):
self.full_clean()
super(MyClass, self).save(*args, **kwargs)
答案 3 :(得分:0)
为什么你不使用Form层? 您可以仅使用表单层作为“验证”层,这意味着,不要使用它来呈现HTML。 即使在JSON API或AJAX上使用Form层也很常见。
例如,您可以使用以下表单:
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的评论中所述。
谢谢!