首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Flask同时验证装饰器多个字段

Flask同时验证装饰器多个字段
EN

Stack Overflow用户
提问于 2015-09-14 08:23:26
回答 2查看 2.3K关注 0票数 26

我一直在使用flask中的sqlalchemy.orm中的@ validate装饰器来验证字段,只要所有字段彼此独立,一切都很顺利,例如:

代码语言:javascript
复制
@validates('field_one')
def validates_field_one(self, key, value):
   #field one validation

@validates('field_two')
def validates_field_two(self, key, value):
   #field two validation

然而,现在我需要做一些验证,这将需要同时访问field_one和field_two。看起来validates接受了validates装饰器的多个参数,但是,它只会为每个参数运行一次验证函数,如下所示:

代码语言:javascript
复制
@validates('field_one', 'field_two')
def validates_fields(self, keys, values):
   #field validation

这将导致先验证field_one,然后验证field_two的工作流。然而,我想同时验证这两者(一个简单的例子是断言field_one的值不是field_two的值,一个例子是禁止图中的自循环,其中field_one和field_two引用节点,并且它在边上执行验证)。怎样做才是最好的方式呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-09 04:33:59

按照在模型上定义的顺序对字段进行排序。然后检查最后一个字段是否是正在验证的字段。否则,只需返回未选中的值。如果验证器正在验证其中一个较早的字段,则其中一些字段将尚未设置。

代码语言:javascript
复制
@validates('field_one', 'field_two')
def validates_fields(self, key, value):
    if key == 'field_two':
        assert self.field_one != value
    return value

参见this example

票数 22
EN

Stack Overflow用户

发布于 2021-07-14 02:55:04

在这里添加另一个答案,因为接受的答案不太符合我使用另一个字段来验证和修改关系/集合字段的用例,这些字段与@validates并不真正兼容。在这种情况下,您可以使用before_flush事件的事件侦听器来实现您想要的结果:

代码语言:javascript
复制
@event.listens_for(Session, 'before_flush')
def validate_and_modify_relationships(session, flush_context, instances):
    """
    Complex validation that cannot be performed with @valdiates
    """
    
    # new records only (for updates only, use session.dirty)
    for instance in session.new:
        if isinstance(instance, MyData):
            if instance.some_other_value:
                instance.some_relation = []

更多详细信息请访问:Flask-SQLAlchemy validation: prevent adding to relationship based on other field

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32555829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档