正在覆盖/阻止数据库上的__set__.属性以强制执行备用集方法/进程



我正在尝试对db.Property进行子类化,并覆盖set方法来实现诸如设置前和设置后逻辑之类的东西。

问题是,在实体到实例的from_entity转换过程中(从数据存储中出来之后),db.Model.__init__()直接在属性上调用__set__,因此显然不应该调用前集和后集逻辑。

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__()来做这件事吗?

不幸的是,没有简单的方法来区分这两种情况。您可以检查堆栈,但这是一种极其笨拙的方法。您可以覆盖Model.__init__,方法是对其进行猴痘匹配,或者要求属性的用户扩展您的自定义模型子类,但我不确定您将如何修改它,以帮助保持与现有属性类的向后兼容。

你可能想看看Guido的NDB项目——它在这方面可能更灵活,而且仍在积极开发中。

最新更新