覆盖/阻止db.Property上的__set__以强制执行备用set方法/进程

时间:2011-06-25 18:34:37

标签: python google-app-engine

我尝试子类db.Property并覆盖 set 方法来实现前置和后置逻辑等内容。

问题是__set__db.Model.__init__()实体转换为实例(从数据存储区出来之后)期间直接在属性上调用from_entity,所以很明显不应该调用后置集逻辑。

class MyProperty(db.StringProperty):
    def __set__(model_instance, value):
        self.pre_set(value)
        super(MyProperty.__set__(model_instance, value)
        self.post_set(value)


class MyModel(db.Model):
    foo = MyProperty()

my_model = MyModel()
my_model.put()
my_model.foo = u'A new string.' """pre/post set logic runs."""

#onload the __set__ method will be called again
loaded_model = db.get(my_model.key())

# In db.Model.__init__()
for prop in self.properties().values():
    value = kwargs.get(prop.name, None) or prop.default() #or something like that
    prop.__set__(self, value) """pre/post set logic also runs :("""

如何在不必覆盖db.Model.__init__()的情况下区分这两种情况?或者我应该这样做?我不应该用prop.__set__()吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,没有简单的方法来区分这两种情况。你可以检查一下堆栈,但这是一种极其愚蠢的方法。您可以覆盖Model.__init__ - 通过monkeypatching它或要求您的属性的用户扩展您的自定义模型子类 - 但我不确定您如何修改它以帮助保持向后兼容现有物业类。

您可能想查看Guido's NDB project - 在这方面可能更灵活,并且仍在积极开发中。