Многоколонное уникальное ограничение с web2py - PullRequest
9 голосов
/ 08 ноября 2011

Можно пометить определенный столбец как уникальный = true.Как правильно обрабатывать уникальные ограничения из нескольких столбцов в web2py?

Например, скажем, у меня есть таблица обменных курсов.Это могут быть столбцы from-currency, to-currency и обменный курс.Не имеет смысла иметь две строки с одинаковыми валютами от и до.Какой самый элегантный или правильный способ сделать комбинацию из / в уникальной?

Ответы [ 2 ]

7 голосов
/ 08 ноября 2011

Предполагая, что данные будут введены через форму, вы можете использовать валидатор формы, например:

db.define_table('rates',
    Field('from_currency'),
    Field('to_currency'))

db.rates.to_currency.requires=IS_NOT_IN_DB(
    db(db.rates.from_currency==request.vars.from_currency), 'rates.to_currency')

Это обеспечит уникальность to_currency среди набора записей, где from_currency соответствует вставляемому новому значению from_currency (поэтому комбинация from_currency и to_currency должна быть уникальной).

Другой вариант - использовать функцию onvalidation для подтверждения того, что два значения различны - это будет выполняться после обычной проверки формы, но до вставки в БД.

Наконец, вы можете вместо этого выполнить проверку на стороне клиента через Javascript.

5 голосов
/ 19 мая 2014

Вы также можете попробовать использовать обратные вызовы До и После . Используя таблицу Энтони в качестве примера, вы бы сделали что-то вроде:

db.rates._before_insert.append( lambda r : db( (db.rates.from_currency==r["from_currency"]) & (db.rates.to_currency==r["to_currency"]) ).select() )

Если запрос .select() возвращает что-либо, кроме None или False, он прервет текущий db.rates.insert() и выдаст False в качестве возврата. Обратите внимание, что он по-прежнему не будет создавать УНИКАЛЬНОЕ ОГРАНИЧЕНИЕ, но его путь более безопасен, чем использование некоторой проверки на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...