我仍在尝试了解在模型级别使用自定义验证器验证 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() 函数吗?(顺便说一句,我知道我可以使用“选择”字段选项来验证我的性别选择,但我创建了“验证性别”以进行说明)。
如果我真的想确保我的数据的完整性,我是否应该不仅编写用于模型层测试的 Django 单元测试,还要使用 Python/Psycopg 编写等效的数据库级单元测试?我注意到引发 ValidationErrors 的 Django 单元测试仅使用数据库副本测试模型对数据库模式的理解。即使我要使用 South 进行迁移,任何数据库级别的约束都仅限于 Django 可以理解并转换为 Postgres 约束的内容。如果我需要一个 Django 无法复制的自定义约束,如果我直接通过 psql 终端与数据库交互,我可能会在我的数据库中输入违反该约束的数据。
谢谢!