使用Coland和SQLAlchemy制作独特的验证器

使用Coland和SQLAlchemy制作独特的验证器,sqlalchemy,pyramid,deform,Sqlalchemy,Pyramid,Deform,我所要做的就是使用金字塔、SQLAlchemy创建一个简单的博客网站。我选择的表单模块是Deform,它使用Coland。因此,目前我的表单中有两个字段:name和url。Url通过音译创建名称字段,但它不需要。所以我不想有两篇文章有相同的网址。我想我需要用项圈做验证器。但问题是验证器按字段执行,而不是按模型记录执行。我的意思是,如果我要为url字段创建验证器,我的方法中没有其他字段的信息,例如id或name,因此我无法执行验证 现在,我已经创建了两个小时的字符串=) 实际上,我认为我应该在模型

我所要做的就是使用金字塔、SQLAlchemy创建一个简单的博客网站。我选择的表单模块是Deform,它使用Coland。因此,目前我的表单中有两个字段:nameurl。Url通过音译创建名称字段,但它不需要。所以我不想有两篇文章有相同的网址。我想我需要用项圈做验证器。但问题是验证器按字段执行,而不是按模型记录执行。我的意思是,如果我要为url字段创建验证器,我的方法中没有其他字段的信息,例如idname,因此我无法执行验证

现在,我已经创建了两个小时的字符串=)

实际上,我认为我应该在模型级别上执行这种验证,即在SQLAlchemy模型中,但当然,其他规则不起作用,因为这些规则主要用于生成SQL脚本(创建表):


实际上,我的问题既不涉及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
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)
@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