Существует ли способ прозрачно выполнить проверку на объектах SQLAlchemy?

Существует ли способ выполнить проверку на объекте после (или как), свойства установлены, но прежде чем сессия фиксируется?

Например, у меня есть модель предметной области 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 выполняет свое волшебство, но я подозреваю, что создание и переопределение этих свойств самостоятельно могли привести к нестабильным и/или непредсказуемым результатам.

17
задан Beau Simensen 6 March 2010 в 07:20
поделиться

1 ответ

"Похоже, что питонический подход заключается в том, чтобы делать большинство вещей в виде свойств"

Это варьируется, но это близко.

"Если бы я писал это на PHP или Java, я бы, вероятно, выбрал создание методов getter/setter..."

Хорошо. Это достаточно по-питоновски. Ваши функции getter и setter связаны в свойстве; это довольно хорошо.

В чем вопрос?

Вы спрашиваете, как пишется property?

Однако "прозрачная валидация" - если я правильно понял ваш пример кода - может оказаться не такой уж хорошей идеей.

Ваша модель и ваша валидация, вероятно, должны быть разделены. Обычно для одной модели существует несколько валидаций. Для некоторых пользователей поля необязательны, фиксированы или не используются; это приводит к нескольким проверкам.

Вам будет удобнее следовать шаблону проектирования Django и использовать форму для валидации, отдельно от модели.

2
ответ дан 30 November 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: