我仍在试图理解在模型级别使用自定义验证器验证Django模型对象的正确方法.我知道验证通常在表单或模型表单中完成.但是,如果通过Python shell中的ORM与数据交互,我希望确保数据在模型级别的完整性.以下是我目前的做法:
from django.db import models
from django.core import validators
from django.core exceptions import ValidationError
def validate_gender(value):
""" Custom validator """
if not value in ('m', 'f', 'M', 'F'):
raise ValidationError(u'%s is not a valid value for gender.' % value)
class Person(models.Model):
name = models.CharField(max_length=128)
age = models.IntegerField()
gender = models.CharField(maxlength=1, validators=[validate_gender])
def save(self, *args, **kwargs):
""" Override Person's save """
self.full_clean(exclude=None)
super(Person, self).save(*args, **kwargs)
以下是我的问题:
我是否应该创建一个自定义验证函数,将其指定为验证器,然后重写Person的save()函数,就像我上面所做的那样?(顺便说一句,我知道我可以使用‘CHOICES’字段选项验证我的性别 Select ,但出于说明的目的,我创建了‘VALIDATE_GENAME’).
如果我really想要确保数据的完整性,我不仅应该编写Django单元测试在模型层进行测试,还应该使用Python/Mental copg编写等效的数据库级单元测试?我注意到,引发ValidationError的Django单元测试只使用数据库副本测试模型对数据库模式的理解.即使我使用South进行迁移,任何数据库级别的约束也仅限于Django能够理解并转换为Postgres约束.如果我需要一个Django不能复制的自定义约束,如果我直接通过psql终端与数据库交互,我可能会将违反该约束的数据输入到我的数据库中.
谢谢!