#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
являются валидаторами. Но
- Это не дает понять, есть ли
unique=True
в expresssionField('title', unique=True)
также средство проверки с точно такой же функциональностью - Какое влияние валидатор оказывает на генерацию форм, управляемых базой данных.
Ответ №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).