Как требовать имя_ключа при создании классов моделей с помощью App Engine? - PullRequest
2 голосов
/ 09 сентября 2010

Я хочу потребовать, чтобы один из моих классов модели указал мой собственный настраиваемый ключ в качестве имени ключа, чтобы я всегда мог рассчитывать на его наличие.Как я могу требовать этого?Например, у меня может быть класс модели, такой как:

class Account(db.Model):
    user = db.UserProperty(required=True)
    email = db.EmailProperty()

И я хочу, чтобы всегда указывалось имя_ключа, требуя создания экземпляра таким образом, как:

    user_obj = users.get_current_user()
    new_user = Account(user=user_obj, key_name=user.user_id())
    new_user.put()

Как это может быть сделано?Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 09 сентября 2010

Вы можете создать базовый класс, например, модели на jaikuengine.

class BaseModel (db.Model):
    def __init__(self, parent=None, key_name=None, _app=None, **kw):
        if not key_name and 'key' not in kw:
            key_name = self.key_from(**kw)

        super(BaseModel, self).__init__(
            parent, key_name=key_name, _app=_app, **kw)

        if not key_name:
            key_name = self.key_from(**kw)

    @classmethod
    def key_from(cls, **kw):
        if hasattr(cls, 'key_template'):
            try:
                return cls.key_template % kw
            except KeyError:
                logging.warn(u'Automatic key_name generation failed: %s <- %s',
                              cls.key_template,
                              kw)
                return None

class Account (BaseModel):
    user = db.UserProperty(required=True)
    email = db.EmailProperty()

    key_template = "account/%(user)s"
2 голосов
/ 09 сентября 2010

Вы можете сделать так, чтобы все экземпляры модели Account проходили через простую фабричную функцию (возможно, назовите сам класс _Account, чтобы разъяснить другим кодировщикам проекта, что сам класс должен быть закрытым):

def make_account(key_name=None, **k):
    if key_name is None:
        raise ValueError('Must specify key_name for account!')
    return _Account(key_name=key_name, **k)

Вы можете стать более изощренным и сделать это в classmethod в классе Account (переопределяя у последнего __init__ с некоторыми проверками, чтобы исключить возможность случайного вызова из другого места), & c, но этоосновная идея: «сделай это в своем коде уровня приложения».

0 голосов
/ 09 сентября 2010

Вот еще один пример того, как требовать, а также проверять имя ключа: Валидатор для свойства Key_name модели в хранилище данных Google App Engine (Python)

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