Кто-нибудь знает умный способ в 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
Пожалуйста, прокомментируйте, если это не очень хороший способ сделать это.