首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >公开GAE中模型的“哑巴式”只读实例。

公开GAE中模型的“哑巴式”只读实例。
EN

Stack Overflow用户
提问于 2010-05-02 19:52:10
回答 1查看 97关注 0票数 2

有没有人知道在Google中有一种聪明的方法来返回一个包装好的Model实例,该实例只公开一些原始属性,并且不允许将实例保存回数据存储?

我并不是在寻找实际执行这些规则的方法,很明显,通过挖掘它的__dict__等,仍然可以更改实例。我只是想要一种避免意外暴露/更改数据的方法。

我最初的想法是这样做(我想为User模型的一个公开版本这样做):

代码语言:javascript
复制
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实例而编写的代码:

代码语言:javascript
复制
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

如果这不是一个好的方法,请评论。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-02 20:01:54

您不能在User类中创建一个方法吗?该方法实例化一个ReadOnlyUser对象并酌情复制成员变量的值?您的调用类似于User.get_by_id(1).readonly(),其readonly方法定义如下:

代码语言:javascript
复制
class User(db.Model):
    def readonly(self):
        return ReadOnlyUser(self.name, self.id);

或者,您也可以让您的User类使用方法扩展另一个类,以便根据一些要复制的静态vars列表属性来自动完成这一任务。

我不用Python编写代码

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2754721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档