如何在使用App Engine创建模型类时需要key_name?

时间:2010-09-09 04:09:48

标签: python google-app-engine web-applications

我想要求我的一个模型类指定我自己的自定义键作为key_name,这样我总是可以依赖它在那里。我该怎么办?例如,我可能有一个模型类,如:

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

我想要求始终指定key_name,需要以下列方式进行实例化:

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

如何做到这一点?提前致谢

3 个答案:

答案 0 :(得分:2)

您可以使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,但这是核心思想:“在应用程序级代码中执行此操作”。

答案 1 :(得分:2)

您可以在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 :(得分:0)

以下是另一个关于如何要求并验证key_name的示例: Validator for the Model key_name property in Google App Engine datastore (Python)