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

如何在使用appengine创建模型类时要求密钥名称?

  •  2
  • Cuga  · 技术社区  · 15 年前

    我想要求我的一个模型类指定我自己的自定义密钥作为密钥名称,这样我就可以一直依赖它。我怎么能要这个?例如,我可能有一个模型类,例如:

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

    我想要求始终指定key\u name,并以如下方式进行实例化:

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

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

    3 回复  |  直到 15 年前
        1
  •  2
  •   Alex Martelli    15 年前

    您可以对 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 帐户 (超越后者的 __init__ 通过一些检查,不可能意外地从其他地方调用),但这是核心思想:“在应用程序级代码中执行”。

        2
  •  2
  •   sahid    15 年前

    您可以在jaikuengine上创建一个类似models的基类。

    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"