モデルレベルでカスタムバリデーターを使用してDjangoモデルオブジェクトを検証する正しい方法を理解しようとしています。検証は通常、フォームまたはモデルフォーム内で行われることを私は知っています。ただし、Pythonシェルの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」フィールドオプションを使用して性別の選択を検証できることはわかっていますが、説明のために「validate_gender」を作成しました)。
データの整合性を本当に確保したい場合は、モデルレイヤーでテストするためのDjango単体テストだけでなく、Python / Psycopgを使用した同等のデータベースレベルの単体テストも作成する必要がありますか?ValidationErrorsを発生させるDjangoユニットテストは、データベースのコピーを使用してデータベーススキーマのモデルの理解をテストするだけであることに気づきました。移行にSouthを使用したとしても、データベースレベルの制約は、Djangoが理解してPostgres制約に変換できるものに制限されます。Djangoが複製できないカスタム制約が必要な場合、psqlターミナルを介してデータベースと直接対話していると、その制約に違反するデータをデータベースに入力する可能性があります。
ありがとう!