在我的 Google App Engine 应用程序中,我有需要存储的模型对象。这些对象由各种策略对象参数化。例如,我的 Event 类有一个 Privacy Policy 对象,该对象决定谁可以查看、更新等。PrivacyPolicy 有各种不同的子类。事件在各个点咨询其 PrivacyPolicy 对象。
class PrivacyPolicy(db.Model):
def can_see(self, event, user):
pass
class OwnerOnlyPolicy(PrivacyPolicy):
def can_see(self, event, user):
return user == event.owner
class GroupOnlyPolicy(PrivacyPolicy):
def can_see(self, event, user):
for grp in event.owner.groups()
if grp.is_member(user):
return True
return False
class OnlyCertainUsersPolicy(PrivacyPolicy):
def __init__(self, others):
self.others = others
def can_see(self, event, user):
return user in others
我可以让我的 Event 类使用 PrivacyPolicy 的 ReferenceProperty:
class Event(db.Model):
privacy: db.ReferenceProperty(PrivacyPolicy)
#…
我不喜欢这样的原因是一对一的关系意味着没有人每次都查询策略对象,不需要维护从策略到其事件对象的反向引用,并且没有其他方式PrivacyPolicy 是一个独立的数据库级对象。它在功能上等同于 IntegerProperty,因为它是 Event 对象状态的一部分,它只是一个对象而不是数字——特别是它是一个可以有零状态或很多状态的对象,对于 Event 类型是未知的。
我找不到任何人谈论如何处理这种情况。有没有我不知道的工具/方法?我只是把它吸起来并使用参考属性和开销吗?
如果处理此问题的唯一其他方法是自定义属性类型,那么任何有关如何处理它的建议都将受到欢迎。我的第一个想法是使用 TextProperty 来存储策略对象 ( policy
) 的字符串 rep,在需要时对其进行解码,缓存结果,并对策略对象进行任何更改使缓存无效并更新字符串 rep。