在App Engine中动态修改实体模型的危险

时间:2014-06-10 19:45:58

标签: python google-app-engine

我有一个类,我的所有实体定义都继承自该类:

class Model(db.Model):
    """Superclass for all others; contains generic properties and methods."""

    created = db.DateTimeProperty(auto_now_add=True)
    modified = db.DateTimeProperty(auto_now=True)

出于各种原因,我希望能够偶尔修改实体而不更改其修改后的属性。我找到了this示例:

Model.__dict__["modified"].__dict__["auto_now"] = False
db.put(my_entity)
Model.__dict__["modified"].__dict__["auto_now"] = True

当我在本地进行测试时,效果很好。我的问题是这样的:对于在Model被改变的小时间段内碰巧保存实体的任何其他代码会有更广泛的影响吗?我可以看到导致令人难以置信的混乱错误。但也许这个小小的改变只影响当前的进程/线程或其他什么?

1 个答案:

答案 0 :(得分:1)

进入同一实例并在投放正在进行时处理的任何其他请求也将获得auto_now=False,尽管不太可能

还有其他需要考虑的事情

您没有try阻止此代码,如果您在put()期间出现超时或错误,您的代码将使模型处于修改状态auto_now=False

个人认为这是一个坏主意,并且定义会成为错误的来源。

有许多方法可以在不操纵模型的情况下实现这一目标,

考虑将默认行为设置为auto_now = False,然后使用两种方法进行更新。主要方法在执行put()之前将修改时间设置为datetime.now(),例如save()和save_without_modified()

一个更好的方法是覆盖你的类中的put(),然后设置modified,然后调用super put()让put()接受像modified=False这样的新参数,这样你就不会设置修改过的在你打电话给超级之前的日期。

最后,您可以使用_pre_put挂钩在put()调用之前运行代码,但是您需要以某种方式注释实例,以便_pre_put方法可以确定是否需要设置修改或不

我认为这些策略中的每一种都比黑客模型更安全