我想要求我的一个模型类指定我自己的自定义键作为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()
如何做到这一点?提前致谢
答案 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)