我希望我的模型自动获取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)
答案 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)