Эквивалентность `required = True` и `IS_NOT_IN_DB` в pyDAL web2py

#web2py #pydal

#web2py #pydal

Вопрос:

В книге web2py приведен пример моделирования графического блога. Строки кода, относящиеся к моему вопросу:

 db.define_table('image',
                Field('title', unique=True),
                Field('file', 'upload'),
                format = '%(title)s')

db.image.title.requires = IS_NOT_IN_DB(db, db.image.title)
  

В тексте указано, что выражения like db.image.title.requires являются валидаторами. Но

  1. Это не дает понять, есть ли unique=True в expresssion Field('title', unique=True) также средство проверки с точно такой же функциональностью
  2. Какое влияние валидатор оказывает на генерацию форм, управляемых базой данных.

Ответ №1:

Из книги:

Обратите внимание, что requires=... это применяется на уровне форм, required=True применяется на уровне DAL (вставка), в то время notnull как, unique и ondelete применяются на уровне базы данных. Хотя иногда они могут показаться избыточными, важно поддерживать различие при программировании с использованием DAL.

unique=True не приводит к созданию средства проверки. Это приводит к UNIQUE добавлению ограничения в схему базы данных, когда web2py сначала создает таблицу в базе данных (при условии, что вы включили миграции). Если вы вызываете методы DAL .insert() или .update() со значениями, которые нарушают это ограничение, база данных выдаст ошибку (что приведет к исключению Python в вашем приложении).

Параметр requires=IS_NOT_IN_DB(...) создает средство проверки, которое будет запущено, когда вы (а) отправляете форму, созданную с использованием SQLFORM или (б) вызываете методы DAL .validate_and_insert() или .validate_and_update() . Если проверка завершается с ошибкой, вставка / обновление вообще не отправляется в базу данных, и вы получаете не исключение Python, а просто запись об ошибке (которая обычно отображается в форме в случае отправки формы).

Если вы будете делать вставки и обновления через формы, рекомендуется использовать средство проверки, поскольку оно обеспечивает надлежащий пользовательский интерфейс (т. Е. Отображение сообщения об ошибке вместе с формой). Также неплохо установить unique=True , чтобы база данных имела соответствующую схему, на случай, если вы выполняете вставки / обновления с помощью средств, отличных от форм (и, возможно, даже за пределами web2py или DAL).