有没有人知道在Google中有一种聪明的方法来返回一个包装好的Model实例,该实例只公开一些原始属性,并且不允许将实例保存回数据存储?
我并不是在寻找实际执行这些规则的方法,很明显,通过挖掘它的__dict__等,仍然可以更改实例。我只是想要一种避免意外暴露/更改数据的方法。
我最初的想法是这样做(我想为User模型的一个公开版本这样做):
class PublicUser(db.Model):
display_name = db.StringProperty()
@classmethod
def kind(cls):
return 'User'
def put(self):
raise SomeError()不幸的是,GAE很早就将这类映射到类,所以如果我执行PublicUser.get_by_id(1),我实际上将得到一个User实例,而不是PublicUser实例。
另外,它至少应该是一个Model实例,这样我就可以将它传递给那些不知道它是一个“哑巴”版本的代码。最终,我想要这样做,这样我就可以在只读版本上使用我的通用数据公开函数,这样它们就只能公开关于用户的公共信息。
更新
我用了西奥的解决方案。下面是我为将属性从User实例复制到PublicUser实例而编写的代码:
class User(db.Model):
# ...
# code
# ...
def as_public(self):
"""Returns a PublicUser version of this object.
"""
props = self.properties()
pu = PublicUser()
for prop in pu.properties().values():
# Only copy properties that exist for both the PublicUser model and
# the User model.
if prop.name in props:
# This line of code sets the property of the PublicUser
# instance to the value of the same property on the User
# instance.
prop.__set__(pu, props[prop.name].__get__(self, type(self)))
return pu如果这不是一个好的方法,请评论。
发布于 2010-05-02 20:01:54
您不能在User类中创建一个方法吗?该方法实例化一个ReadOnlyUser对象并酌情复制成员变量的值?您的调用类似于User.get_by_id(1).readonly(),其readonly方法定义如下:
class User(db.Model):
def readonly(self):
return ReadOnlyUser(self.name, self.id);或者,您也可以让您的User类使用方法扩展另一个类,以便根据一些要复制的静态vars列表属性来自动完成这一任务。
我不用Python编写代码
https://stackoverflow.com/questions/2754721
复制相似问题