2014-01-04 3 views
0

Все, что я пытаюсь сделать, это простой блог-сайт с использованием Pyramid, SQLAlchemy. Выбранным модулем формы является Deform, который использует Coland. Итак, у меня есть два поля в моей форме: имя и url. Url создает путем транслитерации поле имени, но это не так. Поэтому я не хочу иметь две статьи с одинаковыми адресами. Мне нужно как-то сделать валидатор с Коллинзом, я думаю. Но проблема заключается в том, что валидатор выполняет в одном поле, но не в записи модели. Я имею в виду, если бы я сделал валидатор для поля url, у меня нет информации в моем методе о других полях, например id или имя, поэтому я не смог выполнить проверку.Создание уникального валидатора с Coland и SQLAlchemy

Теперь у меня есть там пара строк, которые я создал в течение двух часов =)

from slugify import slugify 

def convertUrl(val): 
    return slugify(val) if val else val 


class ArticleForm(colander.MappingSchema): 
    name = colander.SchemaNode(colander.String()) 
    url = colander.SchemaNode(colander.String(), 
           preparer=convertUrl) 

На самом деле, я думал, что я должен выполнить такую ​​проверку на уровень модели, то есть в модели SQLAlchemy, но правила futher конечно не работают, потому что такие правила существуют в основном для создания сценариев SQL (CREATE TABLE):

class Article(TBase, Base): 
    """ The SQLAlchemy declarative model class for a Article object. """ 
    __tablename__ = 'article' 

    id = Column(Integer, primary_key=True) 
    name = Column(Text, unique=True) 
    url = Column(Text, unique=True) 

ответ

0

на самом деле мой вопрос не относится ни к Deform, ни Дуршлаг, такая проверка должна быть выполнена на уровне SQLAlchemy, вот к чему я пришел:

@validates('url') 
def validate_url_unique(self, key, value): 
    check_unique = DBSession.query(Article)\ 
     .filter(and_(Article.url == value, Article.id != self.id)).first() 

    if check_unique: 
     # Doesn't work 
     raise ValueError('Something went wrong') 

    # Neither doesn't work 
    # assert not check_unique 

    return value 
Смежные вопросы