0

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

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

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)
4

1 回答 1

0

实际上,我的问题既不涉及变形也不涉及滤锅,此验证必须在 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
于 2014-01-05T17:29:36.813 回答