Существует ли способ выполнить проверку на объекте после (или как), свойства установлены, но прежде чем сессия фиксируется?
Например, у меня есть модель предметной области Device
это имеет a mac
свойство. Я хотел бы удостовериться что mac
свойство содержит допустимое и санированное значение Mac, прежде чем оно будет добавлено к или обновлено в базе данных.
Похоже, что подход Pythonic должен сделать большинство вещей как свойства (включая SQLAlchemy). Если бы я кодировал это в PHP или Java, то я, вероятно, решил бы создать метода get/методы установщика, чтобы защитить данные и дать мне гибкость для обработки этого в самой модели предметной области.
public function mac() { return $this->mac; }
public function setMac($mac) {
return $this->mac = $this->sanitizeAndValidateMac($mac);
}
public function sanitizeAndValidateMac($mac) {
if ( ! preg_match(self::$VALID_MAC_REGEX) ) {
throw new InvalidMacException($mac);
}
return strtolower($mac);
}
Что Pythonic путь состоит в том, чтобы обработать этот тип ситуации с помощью SQLAlchemy?
(В то время как я знаю, что проверка и должна быть обработана в другом месте (т.е. веб-платформа), я хотел бы выяснить, как обработать некоторые из этих зависящих от домена правил проверки, поскольку они обязаны часто подходить.)
ОБНОВЛЕНИЕ
Я знаю, что мог использовать свойство, чтобы сделать это при нормальных обстоятельствах. Ключевая роль - то, что я использую SQLAlchemy с этими классами. Я не понимаю точно, как SQLAlchemy выполняет свое волшебство, но я подозреваю, что создание и переопределение этих свойств самостоятельно могли привести к нестабильным и/или непредсказуемым результатам.
"Похоже, что питонический подход заключается в том, чтобы делать большинство вещей в виде свойств"
Это варьируется, но это близко.
"Если бы я писал это на PHP или Java, я бы, вероятно, выбрал создание методов getter/setter..."
Хорошо. Это достаточно по-питоновски. Ваши функции getter и setter связаны в свойстве; это довольно хорошо.
В чем вопрос?
Вы спрашиваете, как пишется property?
Однако "прозрачная валидация" - если я правильно понял ваш пример кода - может оказаться не такой уж хорошей идеей.
Ваша модель и ваша валидация, вероятно, должны быть разделены. Обычно для одной модели существует несколько валидаций. Для некоторых пользователей поля необязательны, фиксированы или не используются; это приводит к нескольким проверкам.
Вам будет удобнее следовать шаблону проектирования Django и использовать форму для валидации, отдельно от модели.