【问题标题】:Detect whether a specific property of an entity has been altered when 'putting' the entity?在“放置”实体时检测实体的特定属性是否已更改?
【发布时间】:2013-04-03 08:54:59
【问题描述】:

正在寻找一种有效的方法来检查 db.Model 的特定属性是否已更改与 putting 它之前存储在数据存储中的版本。显然,我想避免从数据库中获取新实例!是否可以?像这样的:

class MyClass(db.Model):
    prop = db.StringProperty()

instance = MyClass()
instance.string_property = 'string'
instance.put()

instance2 = db.get(instance.key())
instance2.string_property = 'string2'

instance2.put() #would like to detect that string_property was altered!

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore


    【解决方案1】:

    我认为那是个坏主意。

    如果您查看 db 的代码(您现在应该真正使用 ndb),那么每个属性/模型(这里大量使用元类)的引擎盖下都会发生很多事情,具体取决于类/属性和/或值被分配后,您可能会开始遇到一些真正奇怪的行为和/或错误。

    这并不意味着你应该,但要仔细考虑你在做什么;-)

    我会考虑使用钩子(请参阅 nick johnsons 博客了解一些想法 blog.notdot.net/2010/04/...)或切换到 ndb 并使用它的 pre/post 钩子(请参阅模型钩子 https://developers.google.com/appengine/docs/python/ndb/entities#hooks

    【讨论】:

    • 我将如何使用钩子来完成此任务?
    • 一种方法是使用定义 post_get 钩子(读者的另一个练习。或使用已经有 post get 钩子的 ndb)当您检索实体时,将属性值或校验和存储在非持久性实例变量。然后当你去 put 使用 pre_put 钩子检查哪些值发生了变化,或者是否有任何变化,并在 put 之前执行你需要的任何通知。
    • 这也比 setattr 覆盖更好,因为理论上该值可以在最终 put 之前更改几次,并最终回到原始值,因此不需要通知 ;-) 或多个发送通知。例如使用整数属性,然后你不断在循环中添加一些值。
    • 好的,据我了解:在你get 一个实例之后,复制你想要检测的变量(在post_get)然后在pre_put 它应该是微不足道的将您即将与 put 的变量与原始值进行比较。对吗?
    【解决方案2】:

    我意识到这只是一个基本的 Python 编程问题:

    class MyClass():
        prop = 'init string'
    
        def __setattr__(self, name, value):
            print name + ' is being updated to ' + value
    
        test = MyClass()
        test.prop = 'summing else'
    
        prop is being updated to summing else
    

    【讨论】:

    • 我认为那是个坏主意。如果您查看 db 的代码(您现在应该真正使用 ndb),那么每个属性/模型(元类在这里大量使用)的引擎盖下都会发生很多事情,并且取决于类/属性和/或值被分配后,您可能会开始遇到一些真正奇怪的行为和/或错误。您应该考虑使用钩子(请参阅 nick johnsons 博客以获取一些想法 blog.notdot.net/2010/04/…)或切换到 ndb 并使用它的 pre/post 钩子。
    • 我在这个模型上使用了钩子 - 我将如何使用它们来检测特定属性的更新?
    • @Tim Hoffman - 如果您按照 Nick 的博客使用 db hooks 做出答案,我认为这可能是公认的解决方案:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多