【问题标题】:How to require a key_name when creating model classes with App Engine?使用 App Engine 创建模型类时如何要求 key_name?
【发布时间】:2010-09-09 04:09:47
【问题描述】:

我想要求我的模型类之一将我自己的自定义键指定为 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()

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这正是我最终要做的。
    【解决方案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"
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多