使用Coland和SQLAlchemy创建唯一的验证器

时间:2014-01-04 15:20:12

标签: sqlalchemy pyramid deform

我尝试做的只是使用Pyramid,SQLAlchemy的简单博客网站。我选择的表单模块是使用Coland的Deform。所以我现在有两个字段:名称网址。 Url通过音译创建名称字段,但它永远不会。所以我不想有两篇文章使用相同的网址。我想以某种方式与Colland一起制作验证器。但问题是验证器是按字段执行的,而不是每个模型记录。我的意思是如果我为 url 字段创建验证器,我的方法中没有关于其他字段的信息,例如 id name ,所以我无法进行验证。

现在我有几个字符串,我创建了两个小时=)

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模型中,但当然进一步的规则不起作用,因为这些规则主要用于创建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)

1 个答案:

答案 0 :(得分:0)

实际上我的问题既没有提到Deform也没有提到Colander,这个验证必须在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