在Google应用程序引擎中,有人知道一个聪明的方法来返回一个只公开一些原始属性的打包模型实例,并且不允许将该实例保存回数据存储区吗?
我不想寻找实际执行这些规则的方法,显然,通过挖掘实例的
__dict__
等等。我只是想找到一种避免意外暴露/数据更改的方法。
我最初的想法是这样做(我想为一个公共版本的
User
型号):
class PublicUser(db.Model):
display_name = db.StringProperty()
@classmethod
def kind(cls):
return 'User'
def put(self):
raise SomeError()
不幸的是,盖伊很早就把它映射到一个班级,所以如果我这样做的话
PublicUser.get_by_id(1)
我会得到一个
用户
实例返回,而不是
PublicUser
实例。
而且,我们的想法是
至少
似乎是
Model
实例,以便我可以将它传递给不知道它是“简化”版本这一事实的代码。最后,我希望这样做,以便在只读版本上使用我的通用数据公开函数,以便它们只公开有关用户的公共信息。
更新
我提出了ICIO的解决方案。这是我为复制属性而编写的代码
用户
实例转移到
公共用户
实例:
class User(db.Model):
def as_public(self):
"""Returns a PublicUser version of this object.
"""
props = self.properties()
pu = PublicUser()
for prop in pu.properties().values():
if prop.name in props:
prop.__set__(pu, props[prop.name].__get__(self, type(self)))
return pu
如果这不是一个好的方法,请评论。