我尝试子类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__()
吗?
答案 0 :(得分:1)
不幸的是,没有简单的方法来区分这两种情况。你可以检查一下堆栈,但这是一种极其愚蠢的方法。您可以覆盖Model.__init__
- 通过monkeypatching它或要求您的属性的用户扩展您的自定义模型子类 - 但我不确定您如何修改它以帮助保持向后兼容现有物业类。
您可能想查看Guido's NDB project - 在这方面可能更灵活,并且仍在积极开发中。