模型中的自动GUID key_name

时间:2011-11-25 15:10:52

标签: python google-app-engine google-cloud-datastore

我希望我的模型自动获取GUID作为key_name,我正在使用下面的代码。这是解决它的好方法吗?它有任何缺点吗?

class SyncModel(polymodel.PolyModel):
    def __init__(self, key_name=None, key=None, **kwargs):
        super(SyncModel, self).__init__(key_name=str(uuid.uuid1()) if not key else None,key=key, **kwargs)

2 个答案:

答案 0 :(得分:0)

Nick有一篇关于pre and post put hooks的文章,用于设置key_name,我不知道你当前的方法是否有效,但至少你应该知道其他的选项。

答案 1 :(得分:0)

覆盖__init__子类上的Model是危险的,因为除了用户代码使用之外,框架还使用构造函数从数据存储区重建实例。除非您确切知道构造函数如何用于重构现有实体 - 这是一个内部细节并且将来可能会发生变化 - 否则应该避免覆盖它。

相反,定义一个工厂方法,如下所示:

class MyModel(db.Model):
  @classmethod
  def new(cls, **kwargs):
    return cls(key_name=str(uuid.uuid4()), **kwargs)