我正在尝试对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项目——它在这方面可能更灵活,而且仍在积极开发中。