代码之家  ›  专栏  ›  技术社区  ›  Blixt

在GAE中公开一个“简化”的只读模型实例

  •  2
  • Blixt  · 技术社区  · 14 年前

    在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):
        # ...
        # 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
    

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

    1 回复  |  直到 14 年前
        1
  •  4
  •   icio    14 年前

    不能在您的 User 类的实例 ReadOnlyUser 对象并根据需要复制成员变量的值?你的电话是这样的 User.get_by_id(1).readonly() readonly 方法定义如下:

    class User(db.Model):
        def readonly(self):
            return ReadOnlyUser(self.name, self.id);
    

    或者你可以 用户 类使用方法扩展另一个类,以根据列出要复制的属性或其他内容的某些静态变量自动执行此操作。

    P.S.我不用python编码