Правильный способ проверки объектов модели Django?

Я все еще пытаюсь понять, как правильно проверить объект модели 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's save """
        self.full_clean(exclude=None)
        super(Person, self).save(*args, **kwargs)

Вот мои вопросы:

Должен ли я создать пользовательскую функцию проверки, назначить ее в качестве валидатора, а затем переопределить Person 's сохранить () функцию как яВы сделали выше? (Кстати, я знаю, что мог бы подтвердить свой гендерный выбор, используявыбор вариант поля, но я создалvalidate_gender» с целью иллюстрации).

Если ядействительно Хотите обеспечить целостность своих данных, должен ли я писать не только модульные тесты Django для тестирования на уровне модели, но также эквивалентные модульные тесты уровня базы данных с использованием Python / Psycopg? Я'мы заметили, что модульные тесты Django, которые вызывают ValidationErrors, только тестируют модель 'понимание схемы базы данных с использованием копии базы данных. Даже если бы я использовал Юг для миграций, любые ограничения на уровне базы данных ограничиваются тем, что Django может понять и преобразовать в ограничение Postgres. Если мне нужно пользовательское ограничение, которое Джанго может 'Я могу ввести данные в свою базу данных, которые нарушают это ограничение, если яm взаимодействует с базой данных напрямую через терминал psql.

Спасибо! Я

Ответы на вопрос(1)

Ваш ответ на вопрос