2010-09-09 71 views
2

我想要求我的模型類中的一個將我自己的自定義鍵指定爲key_name,這樣我就可以始終依靠它。我如何要求這個?例如,我可能有一個模型類,如:如何在使用App Engine創建模型類時需要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() 

豈今做完了?在此先感謝

回答

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) 

你可以變得更加複雜和Account類做一個classmethod(覆蓋後者的__init__一些檢查,以使它不可能意外地從其他地方打電話),& C,但這是核心理念:「做它在你的應用程序級代碼中「。

+0

感謝,這正是我終於實現了。 – Cuga 2010-09-24 01:29:18

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" 
相關問題