Предоставление «тупого», доступного только для чтения экземпляра модели в GAE - PullRequest
2 голосов
/ 02 мая 2010

Кто-нибудь знает умный способ в Google App Engine вернуть упакованный экземпляр модели, который предоставляет только несколько исходных свойств и не позволяет сохранить экземпляр обратно в хранилище данных?

Я не ищу способов реального применения этих правил, очевидно, что все еще можно будет изменить экземпляр, перебрав его __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, чтобы я мог передать его коду, который не знает о том факте, что он "тупой вниз "версия. В конечном итоге я хочу сделать это так, чтобы я мог использовать свои общие функции обработки данных в версии только для чтения, чтобы они предоставляли только публичную информацию о пользователе.


Обновление

Я пошел с решением icio. Вот код, который я написал для копирования свойств из экземпляра 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

Пожалуйста, прокомментируйте, если это не очень хороший способ сделать это.

1 Ответ

4 голосов
/ 03 мая 2010

Не могли бы вы создать в своем классе User метод, который создает экземпляр объекта ReadOnlyUser и копирует значения переменных-членов соответствующим образом? Ваш вызов будет похож на User.get_by_id(1).readonly() с методом readonly, определенным в следующей форме:

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

Или, возможно, ваш User класс может расширить другой класс с помощью методов, позволяющих сделать это автоматически на основе статических переменных, перечисляющих свойства для копирования, или чего-то еще.

P.S. Я не пишу код на Python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...