我有一个具有相当复杂的业务规则的类。想象一下如果“如果字段A具有值4并且字段B具有值True,则字段C必须是具有至少2个元素的数组”,依此类推。
我正在尝试阻止用户添加不遵守这些规则的此类实例。因此,验证应该在创建和更新时发生。
我看到SqlAlchemy提供了validate方法,但是当验证包含多个字段时,它看起来有点太复杂了。
备选方案似乎是before_insert
和before_update
事件。在这种情况下,这是正确的解决方案,还是我还有其他一些我没有考虑的替代方案?
答案 0 :(得分:0)
这听起来像是一个相当具体的案例。即使在DB约束和/或SQLAlchemy的范围内,您也只能在创建和更新时运行这些检查,所以为什么不引入某种上下文处理器。
在init中你可以拥有:
def __init__(self, ..):
# runs the checks and returns actions
而不是使用db.session.add(class_instance)创建自己的伪上下文处理器:
def update_with_checks(class_instance):
# runs the checks and returns either no action if fails or:
db.session.add(class_instance)
当然,如果数据是在代码范围之外创建的,那么这就会导致数据库的完整性受损。保持数据库完整性的唯一方法是确保将约束写入数据库本身。