我有一个父子关系的数据模型,结构如下:
Container
Metric
Value
这些模型中的每一个都有一个“状态”字段,但只有Value模型允许在该字段上输入;其他模型的ComputedProperty根据其祖先Value模型中的“status”字段而变化。就目前而言,当直接读取模型时,我会在父项上获得当前结果(就像@property行为一样),但当模型是查询的一部分时,我会得到陈旧的结果。
因此,当更新子模型的状态时,我需要更新父模型的“状态”字段。我知道我可以在Value模型中放置一个_post_put_hook()
,只要{!1}}所有父母都更新,但这看起来很昂贵。
答案 0 :(得分:0)
对于索引,您可以获得最终的一致性,这意味着它们通常会在一秒左右内更新,但不能保证。
使用您当前的设计(取决于您的一致性要求),您可能必须以事务方式执行状态更新,可能使用_pre_put_hook(希望能够启动事务)。这是3次写入,但如果您必须更新实体组中的3个嵌套实体,则无法解决这个问题。
我认为没有任何“观察”或自动事件/触发器处理可用。
如果这始终是1:1的关系,那么将它组成一个始终具有状态的单个对象可能是有意义的。潜在的缺点是每次更新时都必须写回所有内容,这对于大对象来说是更多的开销。优势是能够查询任何财产。
如果您需要在每个级别查询状态和其他属性,则需要在任何位置使用状态,否则您可以将状态移动到必须可用于查询的实体。
如果您只查询状态而不查询Container或Metric的其他属性,则可以执行类似
的操作[value_key.parent().parent().get() for value_key in Value.query().get(keys_only=True)]
从Value查询中获取容器列表。