Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 揭露一个",;“沉默下来”;,GAE中模型的只读实例_Python_Google App Engine_Model - Fatal编程技术网

Python 揭露一个",;“沉默下来”;,GAE中模型的只读实例

Python 揭露一个",;“沉默下来”;,GAE中模型的只读实例,python,google-app-engine,model,Python,Google App Engine,Model,在Google App Engine中,有没有人知道一种聪明的方法,可以返回一个包装好的模型实例,该实例只公开一些原始属性,不允许将实例保存回数据存储 我不是在寻找实际执行这些规则的方法,显然,通过挖掘实例的\uuuuu dict\uuuuu等仍然可以更改实例。我只是想要一种避免意外暴露/更改数据的方法 我最初的想法是这样做(我想为用户模型的公共版本这样做): 不幸的是,GAE很早就将该类映射到一个类,因此如果我执行PublicUser.get\u by_id(1)操作,我将实际获得一个User

在Google App Engine中,有没有人知道一种聪明的方法,可以返回一个包装好的模型实例,该实例只公开一些原始属性,不允许将实例保存回数据存储

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

我最初的想法是这样做(我想为
用户
模型的公共版本这样做):

不幸的是,GAE很早就将该类映射到一个类,因此如果我执行
PublicUser.get\u by_id(1)
操作,我将实际获得一个
User
实例,而不是
PublicUser
实例

另外,这个想法是,它至少应该看起来是一个
模型
实例,这样我就可以将它传递给那些不知道它是一个“简化”版本这一事实的代码。最终,我希望这样做,以便我可以在只读版本上使用我的通用数据公开函数,以便它们只公开有关用户的公共信息


更新 我同意ICO的解决方案。下面是我编写的代码,用于将属性从
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

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

您能否在
User
类中创建一个方法,用于实例化
ReadOnlyUser
对象并根据需要复制成员变量的值?您的调用类似于
User.get\u by\u id(1).readonly()
,方法定义如下:

class User(db.Model):
    def readonly(self):
        return ReadOnlyUser(self.name, self.id);
或者,您可以让您的
User
类使用方法扩展另一个类,根据一些列出要复制的属性的静态变量或其他方法自动执行此操作


另外,我不使用Python编写代码

是的,这是一种非常直接的方法=)我可能会这样做。我会这样做=)我更新了我的问题,包括我使用的代码,供感兴趣的人使用。
class User(db.Model):
    def readonly(self):
        return ReadOnlyUser(self.name, self.id);