Я все еще пытаюсь понять правильный способ проверки объекта модели Django с использованием настраиваемого валидатора на уровне модели. Я знаю, что проверка обычно выполняется в форме или в форме модели. Тем не менее, я хочу обеспечить целостность моих данных на уровне модели, если я взаимодействую с ним через ORM в оболочке Python. Здесь мой текущий подход:
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 save """
self.full_clean(exclude=None)
super(Person, self).save(*args, **kwargs)
Вот мои вопросы:
-
Должен ли я создать пользовательскую функцию проверки, назначить ее как валидатор, а затем переопределить функцию Person save(), как я уже сделал выше? (Кстати, я знаю, что могу проверить мои варианты выбора пола, используя опцию "выбор", но я создал "validate_gender" для иллюстрации).
-
Если я действительно хочу обеспечить целостность своих данных, должен ли я не только записывать модульные тесты Django для тестирования на уровне модели, но и эквивалентные модульные тесты уровня базы данных с использованием Python/Psycopg? Я заметил, что модульные тесты Django, которые повышают ValidationErrors, проверяют только модель понимания схемы базы данных с использованием копии базы данных. Даже если бы я использовал Юг для миграции, любые ограничения на уровне базы данных ограничены тем, что Django может понять и перевести в ограничение Postgres. Если мне нужно настраиваемое ограничение, которое Django не может реплицировать, я могу потенциально ввести данные в свою базу данных, которые нарушают это ограничение, если я взаимодействую с базой данных напрямую через терминал psql.
Спасибо!