【发布时间】:2021-07-13 16:21:21
【问题描述】:
我正在使用 flask-sqlalchemy 并尝试验证对我的数据库的输入。对于单个字段,验证装饰器效果很好。但是,我在阻止值被添加到基于另一个字段的值的集合/关系中时遇到问题。例如,考虑以下数据模型:
class MyRelation(db.Model):
__tablename__ = "my_relation"
id = db.Column(db.Integer, primary_key=True)
my_data_id = db.Column(db.Integer, db.ForeignKey("my_data.id"))
some_value = db.Column(db.String)
class MyData(db.Model):
__tablename__ = "my_data"
id = db.Column(db.Integer, primary_key=True)
some_relation = db.relationship("MyRelation", backref="my_data")
some_other_value = db.Column(db.Boolean)
我遇到的问题是,如果some_other_value == True,我想确保some_relation 为空。我研究了以下选项。我不确定是否可以调整其中任何一个以提供预期的功能:
- 将
@validates与多个字段一起使用为specified here。这种方法的问题是它似乎一个一个地验证集合,并且在验证中返回 None 以对格式不正确的输入产生sqlalchemy.orm.exc.FlushError: Can't flush None value found in collection Job.alternate_attributes。返回一个空列表也不起作用。 - 使用
before_insert事件侦听器,如outlined here。我看到的挑战是,这似乎与official docs 中的关系事件不兼容。 - 使用
before_flush事件监听器,听起来它可能与这个用例兼容,但老实说,鉴于我的目标,我很难找到一个很好的例子来说明如何使用它。它非常抽象,我在文档中看不到任何示例(examples 中的both 在before_flush section 末尾提到实际上不包含对before_flush方法的任何引用,它们应该是演示)。
任何指导将不胜感激 - 谢谢!
【问题讨论】:
标签: python sqlalchemy flask-sqlalchemy