我尝试做的只是使用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)
答案 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