如何验证没有任何形式的Django模型的构造函数参数?

时间:2015-07-29 18:39:45

标签: 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=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验证的所有内容都发生在模型表单中。但我的申请没有表格。我需要在模型中进行验证。我怎么能这样做?

4 个答案:

答案 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的评论中所述。

谢谢!